現狀
生産系統CPU占用過高,并且進行了報警
排查方法
執行top指令,檢視是那個程序導緻的,可以确定是pid為22168的java應用導緻的
執行top -Hp指令,檢視這個程序的那個線程導緻cpu過高,如下圖,可以看到是22749線程導緻的
top -Hp 22168
由于jstack裡面的線程号為16進制,需要轉換線程号為16進制,如下圖得到16進制值為58dd
printf "%x\n" 22749
執行jstack生成線程快照儲存至1.txt檔案中,22168為程序id
jstack 22168>1.txt
根據16進制線程号,查詢線程資訊
grep 58dd 1.txt
如上圖,可以看到是調用DesenUtils.desen方法導緻,此方法作用是資料脫敏,裡面用了較為複雜的正規表達式,是以分析是由于特定字元正好遇到此正規表達式,進行大量計算導緻,具體細節請通路(https://cloud.tencent.com/developer/article/1780881),由于此功能不是特别重要,是以為了快速解決此問題,先去除掉此代碼的調用,重新釋出即可。
總結
線上問題定位,相對比較簡單,難點主要在于保留現場,有了現場就能快速定位問題,以下是二種常用排查方式
1、CPU飙高通過jstack指令,定位到線程資訊。
2、記憶體飙高通過jmap dump出堆棧資訊,在通過mat這些工具定位那個類占用過多記憶體。