今早到公司通過(guò)性能監(jiān)控平臺(tái)發(fā)現(xiàn)有段時(shí)間的TP耗時(shí)達(dá)到了200ms虽另,看到這種情況比較詭異;然后查看了服務(wù)器監(jiān)控饺谬,發(fā)現(xiàn)有一臺(tái)服務(wù)節(jié)點(diǎn)CPU達(dá)到了100%洲赵,于是開(kāi)啟問(wèn)題排查之路。
TP耗時(shí)監(jiān)控
CPU監(jiān)控
TOP
首先查看系統(tǒng)資源占用信息商蕴,TOP看一下
發(fā)現(xiàn)正在運(yùn)行的JAVA項(xiàng)目CPU占用率達(dá)到了790%左右了叠萍,那么問(wèn)題一定出在這個(gè)程序中。
找到CPU使用率較高的線(xiàn)程ID(TID):
命令:ps p pid -L -o pcpu,pid,tid,time,tname,cmd
ps p 142 -L -o pcpu,pid,tid,time,tname,cmd
可以看到這個(gè)進(jìn)程中有3個(gè)線(xiàn)程的CPU占用率很高绪商,它們的TID分別為397,527,863
將獲取的線(xiàn)程號(hào)(十進(jìn)制數(shù))轉(zhuǎn)換成十六進(jìn)制
printf "%x\n" 397
結(jié)合進(jìn)程號(hào)和線(xiàn)程號(hào),利用jstack查到異常代碼所在行
jstack -l <pid> | grep <thread-hex-id> -A 10 命令顯示出錯(cuò)的堆棧信息
-A 10 參數(shù)用來(lái)指定顯示行數(shù)苛谷,否則只會(huì)顯示一行信息。
如下圖
可以看到在代碼的第226行有問(wèn)題格郁。也就是說(shuō)是這一句導(dǎo)致cpu占用過(guò)高腹殿。
本地代碼問(wèn)題排查
仔細(xì)看了代碼后,才發(fā)現(xiàn)了一個(gè)弱智問(wèn)題例书,此處的代碼問(wèn)題在于賦值導(dǎo)致部分請(qǐng)求會(huì)陷入死循環(huán)锣尉,開(kāi)發(fā)時(shí)大意了。
修復(fù)后打包上傳决采,程序終于正常了!