記一次排查CPU高的問題


背景

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM