cpu load過高問題分析和解決
基本思維是有東西佔用的CPU_QUEUE,檢視一下程序的狀態。
top -H
shift+o =選擇w (按照狀態排序)
**1. 首先排查哪些程序cpu佔用率高。 通過命令 ps ux
2. 檢視對應Java程序的每個執行緒的CPU佔用率。通過命令:ps -Lp 122427 cu
3. 追蹤執行緒內部,檢視load過高原因。通過命令:jstack pid。
以執行緒jpid為例,現將jpid轉換成16進位制XXXX。 再通過多次監控jstack日誌,排查執行緒jpid的執行軌跡。
4. 通過jstack檢視程式碼執行軌跡,結合已有原始碼,一般可以分析出死迴圈的地方。
cpu load的飆升,一方面可能和full gc的次數增大有關,一方面可能和死迴圈有關係,每次經驗的積累,對於以後定位問題有非常大的好處,這些case積累起來是自己一生的財富,效能領域會把每次遇到的問題整編在這裡,以便作為後續的知識分享打基礎,更期待的是每次問題發生,能夠抽象出一些產品或者工具,方便高效率發現問題和跟蹤問題、解決問題
在cpu高的時候執行:
sudo ./jstack -l 13031 > /home/mydir/jstack.log
儲存當前java堆執行現場,記錄下當時佔用比較高的執行緒pid(即top -H下的執行緒pid)
建議多開幾個視窗同時監控記錄。挑選上述幾個執行緒pid:13243,、13654等,轉成16進位制
printf “%x\n” 13243
printf “%x\n” 13654
分別得到33bb、3556,查詢剛才記錄的java堆執行日誌檔案
cd /home/mydir/
vi jstack.log
查詢33bb、3556這兩個字串,看到的結果如下:**