現狀 生產系統CPU占用過高,並且進行了報警 排查方法 執行top命令,查看是那個進程導致的,可以確定是pid為22168的java應用導致的 執行top -Hp命令,查看這個進程的那個線程導致cpu過高,如下圖,可以看到是22749線程導致的 top -Hp 22168 由於jstack裡面的線程 ...
現狀
生產系統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),為了快速解決此問題,先去除掉此代碼的調用,重新發佈即可。
總結
線上問題定位,相對比較簡單,難點主要在於保留現場,有了現場就能快速定位問題,以下是二種常用排查方式
- CPU飆高通過
jstack
命令,定位到線程信息。 - 記憶體飆高通過
jmap
dump出堆棧信息,在通過mat這些工具定位那個類占用過多記憶體。