工作中,如果機器cpu idle過低,會收到告警
P2
主機名: set-xr-xxxx監控項:
all(#5) cpu.idle < 30 當前值: 0
排查的步驟如下,
- 使用top + 大寫P,查看cpu佔用過高的進程
這裏往往就是後臺java服務,然後要通過進程來排查具體的線程,這時有兩種方法方法一:
- top -H -p [pid] , 這時可以看到該進程下的所有線程,同樣與大寫P結合可以查看cpu佔用過高的線程
方法二: - ps -mp [pid] -o THREAD,tid,time ,此時也可以看到該進程下的所有線程,其中m代表列出該進程下的所有線程,p代表列出線程佔用cpu的時間,o代表格式化輸出
通過以上兩種方法可以獲取到線程id,以下稱爲tid - 將tid轉爲16進制,可以使用以下命令 printf "%xn" [tid],得到的16進制線程id,我們同樣稱爲tid
- jstack [pid] | grep tid(16進制) -A 60,從輸出中排查公司相關的代碼內容,找到問題代碼的行數,進行排查
如果是fullgc導致的,可以進一步dump jvm內存信息進行排查
- jmap -dump:format=b,file=dump-all.hprof [pid] #dump全量內存數據,[pid]替換爲上一步查找的進程id
- jmap -dump:live,format=b,file=dump.hprof [pid] #再次dump存活對象內存數據,注意live參數會觸發fullgc,所以本次dump一定要在上一步全量dump之後執行。
- 使用eclipse的工具mat打開,進行排查