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

码农那点事儿web

关注咱们,一块儿学习进步数据库


做者 | 漫话编程
来源 | 漫话编程(ID:mhcoding)

以前一段时间,由于咱们发现的一个 SaaS 应用程序会间歇性地卡顿、变慢,由于很长时间都没有定位到缘由,因此解决的办法就只能是重启。apache

这个现象和以前咱们遇到的程序变得卡顿不太同样,由于咱们发现这个应用程序不只在高流量期间时会变慢,有时在低流量时期也会变慢。因此这令你们都很奇怪。编程

这类应用程序的变慢,从新启动以后就能够维持一段时间,可是过段时间又有可能会再次出现。微信

故障排除app

当咱们准备排查这个问题的时候,咱们在应用程序速度很慢的时候,尝试着捕获了这个应用程序的线程 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 框架的下一个版本,它是一个从零开始编写的新框架,它有不少性能改进。

最后,若是网站遇到程序被拖慢的问题,那么也能够考虑一下这个因素。

end



● 后台回复【网页特效】,免费获取网页制做特效源码!


推荐阅读 点击标题可跳转


干货 | 绿色破解资源站分享
GitHub宣布已将全部代码永久封存于北极地底1000年!网友炸锅了:我写的bug终于能流传永世了!
JS实现滑动拖动验证码功能的代码
神了!居然用一个脚本就把系统升级到https了,且永久免费
jQuery模仿百度登陆滑动图片角度转正代码  
 
        
        
        
         
         
                  
         
 
        

   


支持就点下在看 转发朋友圈吧

本文分享自微信公众号 - 码农那点事儿(code_ndsh_2018)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索