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