生產系統CPU飆高問題排查
現狀
生產系統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方法導致,此方法作用是數據脫敏,裡面用了較為複雜的正則表達式,所以分析是由於特定字元正好遇到此正則表達式,進行大量計算導致,具體細節請訪問(//cloud.tencent.com/developer/article/1780881),為了快速解決此問題,先去除掉此程式碼的調用,重新發布即可。
總結
線上問題定位,相對比較簡單,難點主要在於保留現場,有了現場就能快速定位問題,以下是二種常用排查方式
- CPU飆高通過
jstack命令,定位到執行緒資訊。 - 記憶體飆高通過
jmapdump出堆棧資訊,在通過mat這些工具定位那個類佔用過多記憶體。
