定位|应用程序被拖慢(罪魁祸首竟然是Log4j!)
往期热门文章:
1、《往期精选优秀博文都在这里了!》
2、华为阿里下班时间曝光:所有的光鲜,都有加班的味道
3、Docker 禁止被列入美国“实体名单”的国家、企业、个人使用
4、日志框架到底是Logback 还是 Log4j2?
5、IDEA 2020.2 重磅发布,动画级新功能预览!
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
之前一段时间,为我们发现的一个SaaS应用程序会间歇性地卡顿、变慢,因为很长时间都没有定位到原因,所以解决的办法就只能是重启。
这个现象和之前我们遇到的程序变得卡顿不太一样,因为我们发现这个应用程序不仅在高流量期间时会变慢,有时在低流量时期也会变慢。所以这令大家都很奇怪。
这类应用程序的变慢,重新启动之后就可以维持一段时间,但是过段时间又有可能会再次出现。
文章图片
文章图片
文章图片
文章图片
故障排除
当我们准备排查这个问题的时候,我们在应用程序速度很慢的时候,尝试着捕获了这个应用程序的线程Dump。有很多种方式来捕获线程转Dump,我们选择了“jstack”工具来获取。
在问题发生时获得线程Dump是非常关键的!然后我们将捕获的线程Dump上传到一个线上线程Dump分析工具(https://fastthread.io/)。该工具立即帮我们生成了一份报告。
报告立即找出了问题的根本原因。分析工具上显示“http-nio-8080-exec-121”线程阻塞了100多个线程。下面是传递依赖图,展示了阻塞线程:
文章图片
从图中可以看到100多个线程被“http-nio-8080-exec-121”线程阻塞。当我们点击图中的“http-nio-8080-exec-121”超链接时,它会打印出线程的堆栈轨迹:
文章图片
仔细观察图中被框出来的部分,你可以看到该线程已经获取到
org.apache.log4j.Logger
的锁,正在进行其他的操作。接下来,我们随便找一个被"http-nio-8080-exec-121"阻塞的线程,看一下他的堆栈信息:
文章图片
看一下上面堆栈跟踪中被框出来的部分。我们可以看到“http-nio-8080-exec-56”当前正处于阻塞(BLOCKED)状态,而阻塞的原因是它正在等待获取
org.apache.log4j.Logger
的锁。前面我们刚刚分析过,“http-nio-8080-exec-121”获得了org.apache.log4j.Logger的锁,正在进行其他操作,而锁并没有被释放,所以其他线程想要获得锁就只能被阻塞。
其余的所有被阻塞的线程也在等待获取
org.apache.log4j.Logger
的锁。因此,每当任何应用程序线程试图记录日志时,它都会因为无法获取到锁而进入阻塞状态。文章图片
文章图片
文章图片
刚开始我们也没有太多的头绪,后来我们尝试借助Google的力量,然后我们用谷歌搜索了"org.apache.log4j.Logger 阻塞 线程"这样的关键字。
我们在Apache Log4j bug数据库中偶然发现了这个有趣的Bug,而且这个Bug早在2015年就被发现了。(https://bz.apache.org/bugzilla/show_bug.cgi?id=57714 )。
文章图片
文章图片
文章图片
这是Log4J框架中已知的bug之一,也是开发新的Log4j2框架的主要原因之一。
由于这个bug,任何试图打印日志的线程都进入了阻塞状态。它导致整个应用程序嘎然而止。一旦应用程序从Log4j迁移到Log4j2框架,问题就解决了。
结论
Log4j已经在2015年8月开始就不再被维护了。如果您的应用程序仍在使用Log4J框架,强烈建议升级到Log4j2框架。Log4j2不仅仅是Log4j框架的下一个版本,它是一个从零开始编写的新框架,它有很多性能改进。
最后,如果网站遇到程序被拖慢的问题,那么也可以考虑一下这个因素。
文章图片
文章图片
文章图片
文章图片
【定位|应用程序被拖慢(罪魁祸首竟然是Log4j!)】关于作者:漫话编程,是一个通过漫画+音频的形式讲解枯燥的编程知识的公众号。致力于让编程变得更有乐趣。
往期热门文章:1、《历史文章分类导读列表!精选优秀博文都在这里了!》
2、互联网公司忽悠员工的黑话,套路太深了。。。
3、两难!到底用 Spring BeanUtils 还是 Apache BeanUtils?
4、滴滴开源了哪些有意思的项目?有点牛脾~
5、图解Spring循环依赖,看过之后面试再也不用慌了!
6、他来了!IDEA 2020.1 新版介绍!不过升级前请注意避坑!
7、七个略火的Spring Boot+Vue开源项目!
8、Linux 11个炫酷的终端命令!你知道几个?
9、十个你可能不曾用过的Linux命令!巨好用!
10、分库分表PK NewSQL数据库!
推荐阅读
- 科学养胃,别被忽悠,其实真的很简单
- 被新冠“病毒”感染的日常生活(八)
- 过年瞎想
- 【读书清单20】写作吧!你值得被看见(2)
- 罗塞塔石碑的意义(古埃及文字的起源,圣书体文字是如何被破解的)
- 【Thesewt】蒙昧(续)
- https请求被提早撤回
- 三国谋略22(找准你的定位)
- 为什么文章被4个专题收录了阅读量却是个位数()
- 陷入父母的心理战,孩子被彻底打败