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