百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

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

yuyutoo 2024-10-16 15:42 5 浏览 0 评论

作者 | 漫话编程

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

之前一段时间,因为我们发现的一个 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 框架的下一个版本,它是一个从零开始编写的新框架,它有很多性能改进。

最后,如果网站遇到程序被拖慢的问题,那么也可以考虑一下这个因素。

相关推荐

微软Win10/Win11版Copilot上线:支持OpenAI o3推理模型

IT之家4月3日消息,科技媒体WindowsLatest昨日(4月2日)发布博文,报道称Windows10、Windows11新版Copilot应用已摘掉Beta帽...

WinForm 双屏幕应用开发:原理、实现与优化

在当今的软件开发领域,多屏幕显示技术的应用越来越广泛。对于WinForm应用程序来说,能够支持双屏幕显示不仅可以提升用户体验,还能满足一些特定场景下的业务需求,比如在演示、监控或者多任务处理等场景...

推荐一个使用 C# 开发的 Windows10 磁贴美化小工具

...

OpenJDK 8 安装(openjdk 8 windows)

通常OpenJDK8和11都能互相编译和通用。我们建议使用11,但是如果你使用JDK8的话也是没有问题的。建议配置使用OpenJDK,不建议使用OracleJDK,主要是因为版...

基于 Linux 快速部署 OpenConnect VPN 服务(ocserv 实战指南)

一、前言在如今远程办公和内网穿透需求日益增长的背景下,搭建一套安全、稳定、高效的VPN系统显得尤为重要。OpenConnectServer(ocserv)是一个开源、高性能的VPN服务端软件...

巧妙设置让Edge浏览器更好用(edge怎么设置好用)

虽然现在新版本的Edge浏览器已经推出,但是毕竟还处于测试的状态中。而Win10系统里面自带的老版Edge浏览器,却越来越不被人重视。其实我们只需要根据实际情况对老版本的Edge浏览器进行一些简单的设...

WPF做一个漂亮的登录界面(wpf页面设计)

...

微软开源博客工具Open Live Writer更新:多项Bug修复

OpenLiveWriter前身是WindowsLiveWriter,是微软WindowsLive系列软件之一,曾经是博主们非常喜爱的一款所见即所得博文编辑工具,支持离线保存,还支持图像编辑...

基于OpenVINO的在线设计和虚拟试穿 | OPENAIGC大赛企业组优秀作品

在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。...

C#开源免费的Windows右键菜单管理工具

...

Windows10或11中隐藏的功能,用它再也不用担心电脑中病毒!

...

Python open函数详解(python open函数源码)

演示环境,操作系统:Win1021H2(64bit);Python解释器:3.8.10。open是Python的一个内置函数,一般用于本地文件的读写操作。用法如下。my_file=open(fi...

Windows 11 安装 Docker Desktop(Windows 11 安装助手 Windows 易升 关系)

...

Windows 11 新版发布:屏幕亮度自适应控制,小组件界面重新设计!

...

世界上最好用的Linux发行版之一,OpenSUSE安装及简单体验

背景之前无意在论坛里看到openSUSE的Linux发行版,被称为世界上最好用的Linux发行版之一(阔怕),一直想体验一下,于是这期做一个安装和简单体验教程吧。...

取消回复欢迎 发表评论: