CPU100%排查總結

ChristalChen發表於2020-11-03

#系統:centos7;openjdk:1.8;
1、簡單介紹:

#1 若CPU100%,可能所有程式都不能正常幹活(假死)

#2 Cpu100%出現情況:沒有多餘CPU切換(所有CPU均被佔用,且不能被釋放)

#3 Cpu100%出現條件:死迴圈、迴圈裡無阻塞、只有計算型任務

注:System.out.println方法有IO,方法裡有synchronized關鍵字、有阻塞。

2、CPU100%排查

#1 jcmd或jps獲取當前異常程式pid
#注 centos7自帶的openjdk1.8若沒有jps等命令,可自行安裝openjdk1.8的開發版

#2 獲取程式pid的執行緒執行情況
top -H -p pid 
找到cpu佔用最高(異常)的執行緒,記錄id

#3 獲取程式pid的堆疊資訊並存進log檔案
jstack pid > tem.log

#4 將第2步獲取的id轉換成十六機制,並在第3步的tem.log檔案裡查詢該程式號,由此鎖定異常API,再具體分析程式碼

注:synchronized引起的死鎖會被jstack pid直接分析出deadlock,因為synchronized關鍵字是jvm提供的,做了優化。

3、請求程式異常情況分析

#1 完全不響應:很有可能deadlock
#2 響應較慢:用jstack排查

#3 排查思路,例如2s不響應算是不太合理算是比較慢:
a、將2s之前jstack生成log和2s之後jstack生成log進行對比,檢視執行緒在還是不在,在的話,檢視為什麼還沒執行完
注:tomcat不太適用,因為tomcat裡是執行緒池,thread可以複用
b、針對tomcat:觀察前後2份log的相關方法呼叫棧,基本沒變化可以說明thread沒幹活;如果大多數thread有問題,基本說明有問題