生產系統CPU飆高問題排查

現狀

生產系統CPU佔用過高,並且進行了報警

image-20221015112157560

排查方法

執行top命令,查看是那個進程導致的,可以確定是pid為22168的java應用導致的

image-20221015112629314

執行top -Hp命令,查看這個進程的那個執行緒導致cpu過高,如下圖,可以看到是22749執行緒導致的

top -Hp 22168

image-20221015112956811

由於jstack裡面的執行緒號為16進位,需要轉換執行緒號為16進位,如下圖得到16進位值為58dd

printf "%x\n" 22749

image-20221015113705448

執行jstack生成執行緒快照保存至1.txt文件中,22168為進程id

jstack 22168>1.txt

根據16進位執行緒號,查詢執行緒資訊

grep 58dd 1.txt

image-20221015114338404

如上圖,可以看到是調用DesenUtils.desen方法導致,此方法作用是數據脫敏,裡面用了較為複雜的正則表達式,所以分析是由於特定字元正好遇到此正則表達式,進行大量計算導致,具體細節請訪問(//cloud.tencent.com/developer/article/1780881),為了快速解決此問題,先去除掉此程式碼的調用,重新發布即可。

總結

線上問題定位,相對比較簡單,難點主要在於保留現場,有了現場就能快速定位問題,以下是二種常用排查方式

  1. CPU飆高通過jstack命令,定位到執行緒資訊。
  2. 記憶體飆高通過jmap dump出堆棧資訊,在通過mat這些工具定位那個類佔用過多記憶體。
Tags: