一、問題現象
top 命令查看顯示服務器負載情況,服務器負載1.31,而且長時間沒降下去,CPU使用率99.9%也異常飈高
load average :系統平均負載均值,三列分別代表 1分鍾、5分鍾、15分鍾。理論上,值越小越好。負載越高,說明可能跑的程序出現異常情況。
一般,如果只是 1 分鍾內的負載比較高,其他兩個負載參數較低, 這說明是暫時現象,問題不大。如果5分鍾、15分鍾負載都超過 1 的話,那就要考慮程序方面的問題了。
CPU使用率:有 10 個開發任務,4名開發人員,但是 10個任務都分配給一個人了,那么此時的CPU使用率為 25%,負載非常高。
CPU平均負載:負載就是cpu在一段時間內正在處理以及等待cpu處理的進程數之和的統計信息,也就是cpu使用隊列的長度統計信息,這個數字越小越好(如果超過CPU核心*0.7就是不正常)。
高速入口,系統負載為0,此時沒車,收費員閑着。負載0.5,一半的車流了,收費員比較閑。負載1,滿負荷,沒時間歇着了。負載1.5,車隊已經排到500米開外了,沒得歇。負載越高,過站時間越長。
二、查看分析
1、磁盤空間 df -l ,空余足,無問題
2、內存使用情況 free ,剩余充足
3、服務流量問題,由於是本地測試程序,無外部突發的高並發訪問,排除。
4、JVM內存情況
4.1、 jmap -heap PID,無GC異常
4.2、GC實時執行情況 jstat -gc PID 5000 ,每五秒輸出一次GC情況。無頻繁FGC情況,排除。
S0C / S1C:年輕代 Survivor 區容量
S0U / S1U:年輕代 Survivor 區使用量
EC / EU :年輕代 Eden 區容量 / 使用量
OC / OU :Old老年代容量 / 使用量
MC / MU :Metaspace 元空間初始大小 / 使用量
YGC / YGCT :程序啟動到采樣時的年輕代GC次數 / 耗時
FGC / FGCT:程序啟動到采樣時的老年代GC次數 / 耗時
5、查看運行中的Java程序進程
5.1、查看異常CPU使用率進程
5.1、導出異常飈高的PID對應的線程快照信息, jstack -l PID > /opt/apps/12001/12001.stack
5.2、查看對應進程中哪個線程占用異常過高, top -H -p PID
5.3、對應線程PID十進制轉為十六進制, printf "%x\n" PID
5.4、下載 5.1 中的快照文件到本地,或者直接查找文件內容 grep -C20 6f8 12001.stack
5.5、根據對應信息,去程序中查看,這里使用的是本地測試程序,線程一直RUNNABLE,程序中while無限循環,即為問題所在。
6、CPU使用率低負載高
原因:等待磁盤I/O完成的進程過多,導致進程隊列長度過大,但是CPU運行的進程卻很少,這樣就體現到負載過大了,CPU使用率低。