記一次排查CPU高的問題

lbr617發表於2021-11-05

背景

將log4j.xml的日誌級別從error調整為info後,進行壓測發現CPU佔用很高達到了90%多(之前也就是50%,60%的樣子).

 

 

問題排查

 

排查思路:  看程式中的執行緒到底執行的是什麼,導致CPU佔用較高.

 

1. 使用top命令檢視到底是哪個應用佔用的cpu比較高

 

左邊的圖是日誌級別為info CPU較高的伺服器, 右邊為輸出級別為error cpu正常的伺服器.

 

 

2. 使用top -Hp pid 命令檢視程式中的執行緒

可以看到左邊執行中的執行緒比右邊要多(實際上左邊執行狀態的執行緒常態為30左右),接下來通過jstack命令檢視這些執行緒到底在做什麼

 

3. 將步驟2 找到的執行緒的pid 使用printf %x pid 轉換為16進位制,第四步使用

 

 

4. 使用jstack命令查詢這個執行緒到底在做什麼

jstack [程式]|grep -A 10 [執行緒的16進位制]

示例: jstack 21125|grep -A 10 52f1 

-A 10表示查詢到所在行的後10行。21233用計算器轉換為16進位制52f1,注意字母是小寫。

 

這時候就可以看到具體執行緒執行的堆疊資訊了, 可以看到有大量的執行緒都在執行一下的程式碼:

按照堆疊資訊層層追蹤找到了關鍵的屬性:

 

 

檢視配置檔案:

 

該配置配置為true時log4j2將會獲取堆疊的快照(snapshot),並遍歷堆疊跟蹤以查詢位置資訊,因此會消耗較多的時間.

 

將該配置關閉,解決了CPU高的問題

 

總結

 

排查CPU高的問題的思路:

1. 先檢視對應的程式,看看是哪個程式消耗的多

2. 然後再去看程式中的執行緒到底在執行什麼程式碼. 

3.找到了具體執行的程式碼就可以具體問題具體分析了.

相關文章