天天看點

記一次CPU持續100%及分析方法

WinDbg分析CPU 100%

背景

某天晚上八點多,突然收到一個 CPU 爆表的告警。

記一次CPU持續100%及分析方法

過了一會,幾個業務線就開始回報系統變慢了。

後面緊急處理了這台機器後,讓業務先恢複正常。

後續看了一下監控,拔涼拔涼的。

記一次CPU持續100%及分析方法

這個服務是比較重要的一個老業務,.NET Framework 的 Web API 項目。

回過頭來看一下,要找出造成了 CPU 持續 100% 的根本原因,這樣才能把這個雷去掉。

要分析的話,需要建立了一個 CPU 持續很高的時候的 dump 包,然後用 WinDbg 來處理。

下面來分析一下,探個究竟。

WinDbg 分析

WinDbg分析CPU,用的比較多的其實就那幾個指令。

照着走一遍基本就出來結果了。

首先是用

!threadpool

檢視目前CPU狀況和線程資訊。

記一次CPU持續100%及分析方法

上面主要的是 76% 的 CPU 使用率。

然後是用

!runaway

看線程的耗時,看那個占用多

記一次CPU持續100%及分析方法

從上圖可以看出 32 、34 、38 、39 這幾個線程比較可疑。

下面就是切換到對應的線程看具體的資訊了。

~34s

切換到 34 号線程,如果是其他,按需替換即可。

然後用

!clrstack

看這個線程在執行什麼内容

記一次CPU持續100%及分析方法

上面的圖很清晰的告訴我們,有一個 ConverAgeMonth 的方法,裡面用到了正則。說到正則,用的不好,真的很容易出問題。

到這裡基本就知道問題出在那裡了。

下面還要看具體的參數資訊,才會更加清晰一點。

這裡用的是

!clrstack -p

這個指令。

記一次CPU持續100%及分析方法

可以看到 ConverAgeMonth 這個方法有兩個參數, age 和 ageMonth。

點一下 age 對應的位址或者手動輸入

!do 位址

就可以看到具體的字元串内容了。

記一次CPU持續100%及分析方法

看到這個超級長字元串,長度接近 2w 。。。。

同樣看了其他幾個,都是如出一轍,可以斷定就是那個正則惹的禍了。

後續調整了這一塊的内容後就沒有出現過了 CPU 爆表的情況了。

寫在最後

雖然 WinDbg 用起來感覺很不錯,不過整體流程相對複雜一點,相當于是離線分析,不能實時進行觀測和分析。

這一塊還有待完善,有很大的提升空間。

記一次CPU持續100%及分析方法

如果您認為這篇文章還不錯或者有所收獲,可以點選右下角的【推薦】按鈕,因為你的支援是我繼續寫作,分享的最大動力!

作者:Catcher Wong ( 黃文清 )

來源:http://catcher1994.cnblogs.com/

聲明:

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。如果您發現部落格中出現了錯誤,或者有更好的建議、想法,請及時與我聯系!!如果想找我私下交流,可以私信或者加我微信。

繼續閱讀