Log4j Bug –减慢您的应用程序
最近,我們正在對流行的SaaS應(yīng)用程序進行故障排除。 該應(yīng)用程序間歇性地減慢了速度。 要從問題中恢復,必須重新啟動應(yīng)用程序。 在高流量期間,此應(yīng)用有時會變慢; 有時在交通繁忙時也是如此。 沒有凝聚力模式。
這種應(yīng)用程序變慢并重新啟動它持續(xù)了一段時間。 然后,我們開始解決問題。 我們發(fā)現(xiàn)了一些有趣的東西,以為您也可以從我們的發(fā)現(xiàn)中受益,因此撰寫了本文。
技術(shù)棧
這個流行的SaaS應(yīng)用程序在Azure云上運行。 下面是它的技術(shù)堆棧:
+ Spring框架
+ GlassFish應(yīng)用服務(wù)器
+ Java 8
+ Azure云
故障排除
得知此問題后,我們就在發(fā)生減速時從該應(yīng)用程序捕獲了線程轉(zhuǎn)儲。 有多種捕獲線程轉(zhuǎn)儲的選項 ; 我們選擇了“ jstack”工具來捕獲線程轉(zhuǎn)儲。
注意:發(fā)生問題時,正確獲取線程轉(zhuǎn)儲非常重要。 在問題持續(xù)時間窗口之外捕獲的線程轉(zhuǎn)儲將無用。
現(xiàn)在,我們將捕獲的線程轉(zhuǎn)儲上傳到fastThread.io –在線線程轉(zhuǎn)儲分析工具。 該工具立即生成了此精美報告 。 (我們建議您單擊超鏈接以查看生成的報告,以便獲得第一手的經(jīng)驗)。
該報告立即縮小了問題的根本原因。 fastThread.io工具突出顯示“ http-nio-8080-exec-121”線程正在阻止134個應(yīng)用程序線程。 下面是傳遞依賴關(guān)系圖,顯示了已阻塞的線程:
圖:fastThread.io顯示了已阻塞線程的傳遞依賴關(guān)系
從該圖可以看到134個應(yīng)用程序線程被“ http-nio-8080-exec-121”線程阻塞(第一個從左側(cè)開始)。 當我們單擊圖中的“ http-nio-8080-exec-121”超鏈接時,它會打印線程的堆棧跟蹤:
圖:http-nio-8080-exec-121獲得的org.apache.log4j.Logger鎖
我要求您仔細查看堆棧跟蹤中突出顯示的部分。 您可以看到線程獲得org.apache.log4j.Logger鎖,然后繼續(xù)前進以將日志記錄寫入Azure云存儲。
現(xiàn)在,讓我們看一下“ http-nio-8080-exec-56”線程(134個被阻塞的線程之一)的堆棧跟蹤:
圖:http-nio-8080-exec-56等待獲得org.apache.log4j.Logger鎖
看一下上面堆棧跟蹤中突出顯示的部分。 它正在等待獲取org.apache.log4j.Logger鎖。 您可以看到'http-nio-8080-exec-56'線程處于BLOCKED狀態(tài),因為'http-nio-8080-exec-114'獲得了org.apache.log4j.Logger鎖并且沒有釋放它。
其余的134個線程也被卡住,等待'org.apache.log4j.Logger'鎖。 因此,每當任何應(yīng)用程序線程嘗試登錄時,它都會進入此BLOCKED狀態(tài)。 因此134個應(yīng)用程序線程結(jié)束進入此BLOCKED狀態(tài)。
然后,我們用google搜索org.apache.log4j.Logger BLOCKED線程。 我們偶然發(fā)現(xiàn)了Apache Log4j錯誤數(shù)據(jù)庫中報告的這個有趣的缺陷 。
事實證明,這是Log4J框架中的已知錯誤之一,也是開發(fā)新Log4j2框架的主要原因之一。 以下是該缺陷描述的有趣摘錄:
沒有針對此問題的臨時修復程序,這是Log4j 2出現(xiàn)的原因之一。 唯一的解決方法是升級到Log4j 2。
是的,我是說Log4j 2中的代碼有很大不同,并且鎖定的處理方式也有很大不同。 根記錄器或附加器循環(huán)上沒有鎖。
由于該錯誤,任何試圖登錄的線程都進入了“阻塞”狀態(tài)。 這導致整個應(yīng)用程序停止運行。 將應(yīng)用程序從Log4j遷移到Log4j2框架后,問題得到解決。
結(jié)論
1. Log4j已于2015年8月達到停產(chǎn)(已停產(chǎn))。不再受支持。 如果您的應(yīng)用程序仍在使用Log4J框架,我們強烈建議您升級到Apache Log4j2框架。 這是遷移指南 。 Log4j2不僅僅是Log4j框架的下一版本; 這是一個從頭開始編寫的新框架。 它具有很多性能改進。
2.此外,現(xiàn)在您還可以學習如何對無響應(yīng)的應(yīng)用程序進行故障排除。
翻譯自: https://www.javacodegeeks.com/2020/01/log4j-bug-slows-down-your-app.html
總結(jié)
以上是生活随笔為你收集整理的Log4j Bug –减慢您的应用程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: m3a760m电脑主板(m3a78m主板
- 下一篇: 平板电脑怎么打开网络不可用(平板无法显示
