生產(chǎn)系統(tǒng)CPU飆高問(wèn)題排查
現(xiàn)狀
系統(tǒng)平穩(wěn)運(yùn)行了2年時(shí)間,一直沒(méi)出現(xiàn)過(guò)問(wèn)題,突然這兩天進(jìn)行CPU占用過(guò)高報(bào)警,如下:
排查方法
執(zhí)行top命令,查看是哪個(gè)進(jìn)程導(dǎo)致的,可以確定是pid為22168的java應(yīng)用導(dǎo)致的:
執(zhí)行top -Hp命令,查看這個(gè)進(jìn)程的那個(gè)線程導(dǎo)致cpu過(guò)高,如下圖,可以看到是22749線程導(dǎo)致的:
top -Hp 22168
由于jstack里面的線程號(hào)為16進(jìn)制,需要轉(zhuǎn)換線程號(hào)為16進(jìn)制,如下圖得到16進(jìn)制值為58dd:
printf "%x\n" 22749
執(zhí)行jstack生成線程快照保存至1.txt文件中,22168為進(jìn)程id:
jstack 22168>1.txt
根據(jù)16進(jìn)制線程號(hào),查詢線程信息:
grep 58dd 1.txt
如上圖,可以看到是調(diào)用DesenUtils.desen方法導(dǎo)致,此方法作用是數(shù)據(jù)脫敏,里面用了較為復(fù)雜的正則表達(dá)式,所以分析是由于特定字符正好遇到此正則表達(dá)式,進(jìn)行大量計(jì)算導(dǎo)致,為了快速解決此問(wèn)題,先去除掉此代碼的調(diào)用,重新發(fā)布即可。
https://cloud.tencent.com/developer/article/1780881,正則導(dǎo)致cpu飆高問(wèn)題描述,請(qǐng)查看此地址。
總結(jié)
線上問(wèn)題定位,相對(duì)比較簡(jiǎn)單,難點(diǎn)主要在于保留現(xiàn)場(chǎng),有了現(xiàn)場(chǎng)就能快速定位問(wèn)題,以下是二種常用排查方式:
- CPU飆高通過(guò)jstack命令,定位到線程信息。
- 內(nèi)存飆高通過(guò)jmap dump出堆棧信息,再通過(guò)mat這些工具定位那個(gè)類占用過(guò)多內(nèi)存。