WinDbg分析CPU 100%
背景
某天晚上八點多,突然收到一個 CPU 爆表的告警。
過了一會,幾個業務線就開始回報系統變慢了。
後面緊急處理了這台機器後,讓業務先恢複正常。
後續看了一下監控,拔涼拔涼的。
這個服務是比較重要的一個老業務,.NET Framework 的 Web API 項目。
回過頭來看一下,要找出造成了 CPU 持續 100% 的根本原因,這樣才能把這個雷去掉。
要分析的話,需要建立了一個 CPU 持續很高的時候的 dump 包,然後用 WinDbg 來處理。
下面來分析一下,探個究竟。
WinDbg 分析
WinDbg分析CPU,用的比較多的其實就那幾個指令。
照着走一遍基本就出來結果了。
首先是用
!threadpool
檢視目前CPU狀況和線程資訊。
上面主要的是 76% 的 CPU 使用率。
然後是用
!runaway
看線程的耗時,看那個占用多
從上圖可以看出 32 、34 、38 、39 這幾個線程比較可疑。
下面就是切換到對應的線程看具體的資訊了。
用
~34s
切換到 34 号線程,如果是其他,按需替換即可。
然後用
!clrstack
看這個線程在執行什麼内容
上面的圖很清晰的告訴我們,有一個 ConverAgeMonth 的方法,裡面用到了正則。說到正則,用的不好,真的很容易出問題。
到這裡基本就知道問題出在那裡了。
下面還要看具體的參數資訊,才會更加清晰一點。
這裡用的是
!clrstack -p
這個指令。
可以看到 ConverAgeMonth 這個方法有兩個參數, age 和 ageMonth。
點一下 age 對應的位址或者手動輸入
!do 位址
就可以看到具體的字元串内容了。
看到這個超級長字元串,長度接近 2w 。。。。
同樣看了其他幾個,都是如出一轍,可以斷定就是那個正則惹的禍了。
後續調整了這一塊的内容後就沒有出現過了 CPU 爆表的情況了。
寫在最後
雖然 WinDbg 用起來感覺很不錯,不過整體流程相對複雜一點,相當于是離線分析,不能實時進行觀測和分析。
這一塊還有待完善,有很大的提升空間。
如果您認為這篇文章還不錯或者有所收獲,可以點選右下角的【推薦】按鈕,因為你的支援是我繼續寫作,分享的最大動力!
作者:Catcher Wong ( 黃文清 )
來源:http://catcher1994.cnblogs.com/
聲明:
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。如果您發現部落格中出現了錯誤,或者有更好的建議、想法,請及時與我聯系!!如果想找我私下交流,可以私信或者加我微信。