工作中,如果機(jī)器cpu idle過低肤视,會收到告警
P2
主機(jī)名: set-xr-xxxx監(jiān)控項:
all(#5) cpu.idle < 30 當(dāng)前值: 0
排查的步驟如下奥此,
使用top + 大寫P到腥,查看cpu占用過高的進(jìn)程
這里往往就是后臺java服務(wù),然后要通過進(jìn)程來排查具體的線程萌业,這時有兩種方法
方法一:top -H -p [pid] , 這時可以看到該進(jìn)程下的所有線程坷襟,同樣與大寫P結(jié)合可以查看cpu占用過高的線程
方法二:ps -mp [pid] -o THREAD,tid,time ,此時也可以看到該進(jìn)程下的所有線程生年,其中m代表列出該進(jìn)程下的所有線程婴程,p代表列出線程占用cpu的時間,o代表格式化輸出
通過以上兩種方法可以獲取到線程id抱婉,以下稱為tid將tid轉(zhuǎn)為16進(jìn)制档叔,可以使用以下命令 printf "%xn" [tid],得到的16進(jìn)制線程id蒸绩,我們同樣稱為tid
jstack [pid] | grep tid(16進(jìn)制) -A 60衙四,從輸出中排查公司相關(guān)的代碼內(nèi)容,找到問題代碼的行數(shù)患亿,進(jìn)行排查
如果是fullgc導(dǎo)致的传蹈,可以進(jìn)一步dump jvm內(nèi)存信息進(jìn)行排查jmap -dump:format=b,file=dump-all.hprof [pid] #dump全量內(nèi)存數(shù)據(jù),[pid]替換為上一步查找的進(jìn)程id
jmap -dump:live,format=b,file=dump.hprof [pid] #再次dump存活對象內(nèi)存數(shù)據(jù),注意live參數(shù)會觸發(fā)fullgc惦界,所以本次dump一定要在上一步全量dump之后執(zhí)行挑格。
使用eclipse的工具mat打開,進(jìn)行排查