1. 程式人生 > >記一次生產環境CPU佔用飆高問題解決

記一次生產環境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