背景
將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.找到了具體執行的程式碼就可以具體問題具體分析了.