漫画:应用程序被拖慢?罪魁祸首是 Log4j!







之前一段时间,因为我们发现的一个 SaaS 应用程序会间歇性地卡顿、变慢,因为很长时间都没有定位到原因,所以解决的办法就只能是重启。
这个现象和之前我们遇到的程序变得卡顿不太一样,因为我们发现这个应用程序不仅在高流量期间时会变慢,有时在低流量时期也会变慢。所以这令大家都很奇怪。
这类应用程序的变慢,重新启动之后就可以维持一段时间,但是过段时间又有可能会再次出现。




故障排除
当我们准备排查这个问题的时候,我们在应用程序速度很慢的时候,尝试着捕获了这个应用程序的线程 Dump。有很多种方式来捕获线程转 Dump,我们选择了“jstack”工具来获取。
在问题发生时获得线程 Dump 是非常关键的!
然后我们将捕获的线程Dump上传到一个线上线程Dump分析工具(https://fastthread.io/)。该工具立即帮我们生成了一份报告。
报告立即找出了问题的根本原因。分析工具上显示“http-nio-8080-exec-121”线程阻塞了 100 多个线程。下面是传递依赖图,展示了阻塞线程:


接下来,我们随便找一个被"http-nio-8080-exec-121"阻塞的线程,看一下他的堆栈信息:

前面我们刚刚分析过,“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 框架的下一个版本,它是一个从零开始编写的新框架,它有很多性能改进。
最后,如果网站遇到程序被拖慢的问题,那么也可以考虑一下这个因素。






更多精彩推荐
☞华为手机安卓系统可能停更,或启用鸿蒙系统;雷军:小米开启“重新创业” ;Debian GNU/Linux诞生27周年|极客头条
☞连按 5 次 Shift 重改 CMD 和密码并重启电脑,这个漏洞你不能不知道!
☞出海、拆分、集成公链,“国家队区块链选手”BSN在下一盘怎样的棋?
点分享 点点赞 点在看
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
- 1 从“水之道”感悟“国之交” 7904313
- 2 台当局被曝和日本出现军事勾连迹象 7809398
- 3 1818名明星网红等人查补税款15.23亿 7712038
- 4 全国冰雪季玩法大盘点 7618362
- 5 女子遭75岁丈夫家暴 村民发声 7521312
- 6 周星驰《鹿鼎记》重映首日票房仅18万 7423547
- 7 净网:网民造谣汽车造成8杀被查处 7330097
- 8 政治局召开会议 分析明年经济工作 7238137
- 9 退学北大考上清华小伙被欠家教费 7135463
- 10 流感自救抓住“黄金48小时” 7045808










CSDN
