天天看點

生産系統CPU飙高問題排查

作者:架構成長指南

現狀

生産系統CPU占用過高,并且進行了報警

生産系統CPU飙高問題排查

排查方法

執行top指令,檢視是那個程序導緻的,可以确定是pid為22168的java應用導緻的

生産系統CPU飙高問題排查

執行top -Hp指令,檢視這個程序的那個線程導緻cpu過高,如下圖,可以看到是22749線程導緻的

top -Hp 22168
           
生産系統CPU飙高問題排查

由于jstack裡面的線程号為16進制,需要轉換線程号為16進制,如下圖得到16進制值為58dd

printf "%x\n" 22749
           
生産系統CPU飙高問題排查

執行jstack生成線程快照儲存至1.txt檔案中,22168為程序id

jstack 22168>1.txt
           

根據16進制線程号,查詢線程資訊

grep 58dd 1.txt
           
生産系統CPU飙高問題排查

如上圖,可以看到是調用DesenUtils.desen方法導緻,此方法作用是資料脫敏,裡面用了較為複雜的正規表達式,是以分析是由于特定字元正好遇到此正規表達式,進行大量計算導緻,具體細節請通路(https://cloud.tencent.com/developer/article/1780881),由于此功能不是特别重要,是以為了快速解決此問題,先去除掉此代碼的調用,重新釋出即可。

總結

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

1、CPU飙高通過jstack指令,定位到線程資訊。

2、記憶體飙高通過jmap dump出堆棧資訊,在通過mat這些工具定位那個類占用過多記憶體。

繼續閱讀