線上環境機器cpu持續佔用高排查步驟

       前段時間遇到生產環境下機器cpu持續佔用很高的問題,趕緊檢查近期發佈情況以及代碼改動,看了後發現都是些平常改動,並不會引起這麼大的“動靜”。那麼如何排查是怎麼引起的呢?谷歌百度一下,發現解決步驟如下:

1. 登錄線上機器,控制檯輸入top命令,查看各進程cpu使用情況,先定位是哪個進程出問題。比如此時發現PID爲2633的Java進程佔用CPU高達300%,出現故障。

2. 找到該進程後,下一步就是定位是哪個線程出問題。控制檯輸入:ps -mp 2633 -o THREAD,tid,time | sort -rn 命令,該命令可以顯示當前進程的線程列表,並按照CPU佔用高的線程排序。顯示結果如下:
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
root     10.5  19    - -         -      -  3626 00:12:48
root     10.1  19    - -         -      -  3593 00:12:16

找到了耗時最高的線程3626,佔用CPU時間有12分鐘。

3. 將線程id,也就是tid轉換爲16進制格式,控制檯輸入: printf "%x\n" 3626,輸出:e2a

4. 打印該線程的堆棧信息,控制檯輸入:jstack 2633 | grep e2a -A 30,注意該命令不僅需要線程id,還要用到前面的進程id,也就是pid=2633,tid=e2a。最後根據日誌定位問題。

       那麼我遇到的這次線上cpu佔用很高的問題是什麼導致的呢,說出來可能大家不信,是正則表達式引起的,我們這個工程依賴運維那邊的一個庫,其中有一個方法是校驗url地址,方法實現中有一個正則表達式編寫的坑。隨便搜搜,發現類似線上故障有很多。正則表達式威力很強大,如果用的不好,破壞力也是很強的。關於正則表達式引起cpu飆升的文章大家可以看看這篇:《藏在正則表達式裏的陷阱,竟讓CPU飆升到100%!》

 

參考資料:https://www.cnblogs.com/yanduanduan/p/7132207.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章