記一次生產環境CPU佔用飆高問題解決
1 問題來源與背景
問題背景,專案對外提供查詢航班艙位介面,對航信黑屏報文做正則解析返回。由於起初對正則不熟悉,對黑屏報文格式規律不清楚,導致寫了大量的長正則表示式,生產環境併發量上來(200/s),直接導致CPU使用率峰值徘徊在100%,運維報警反饋。
2 運維報警
3 問題定位與解決
(1)第一步 , 用jps 檢視java pid
(2)第二步,顯示執行緒列表 ps -mp 42 -o THREAD,tid,time
可以看到CPU佔用率很高執行緒,如上面顯示標紅的執行緒。
(3)第三步,選擇自己要看的執行緒id , 即tid。將其轉換成16進位制格式。當時選擇的是tid 為211.
(4)第四步 列印堆疊資訊
(5)第五步 從堆疊資訊中定位問題程式碼
定位到問題程式碼在 AvQueryClientImpl的319行。具體是由於長正則匹配,吃CPU引起,併發量上來扛不住。
根據業務情景,把正則精簡到了原來1/20的長度。CPU佔用恢復正常,峰值在10%左右。
4 涉及命令附錄
(1)JPS命令
Jps(Java Virtual MachineProcess Status Tool)是JDK 1.5提供的一個顯示當前所有java程序pid的命令,
簡單實用,非常適合在linux/unix平臺上簡單察看當前java JVM程序的一些簡單情況。
<1>jps
列出pid
<2>jps -l
列出pid和java主類全稱
<3> jps -v
列出pid和JVM引數
(2)Jstack命令
jstack是java虛擬機器自帶的一種堆疊跟蹤工具。jstack用於生成java虛擬機器當前時刻的執行緒快照。
執行緒快照是當前java虛擬機器內每一條執行緒正在執行的方法堆疊的集合,生成執行緒快照的主要目的是定位執行緒出現長時間停頓的原因,
如執行緒間死鎖、死迴圈、請求外部資源導致的長時間等待等。 執行緒出現停頓的時候通過jstack來檢視各個執行緒的呼叫堆疊,就可以知
道沒有響應的執行緒到底在後臺做什麼事情,或者等待什麼資源。 如果java程式崩潰生成core檔案,jstack工具可以用來獲得core
檔案的java stack和native stack的資訊,從而可以輕鬆地知道java程式是如何崩潰和在程式何處發生問題。
Usage:
jstack [-l] <pid>
jstack -F [-m] [-l] <pid>
Options:
-F 強制dump執行緒堆疊資訊. 用於程序hung住, jstack <pid>命令沒有響應的情況
-m 同時列印java和本地(native)執行緒棧資訊,m是mixed mode的簡寫
-l 列印鎖的額外資訊
(3)附錄linux常用的指令
(1)ps指令報告系統程序狀態。http://man.linuxde.net/ps
(2)printf命令格式化並輸出結果到標準輸出。 http://man.linuxde.net/printf
5 拓展參考附錄
(1)cpu佔用過高https://blog.csdn.net/u013066244/article/details/53503530
(2)Linux系統監控常用命令
http://www.xitongzhijia.net/xtjc/20141203/31828.html