記一次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 用起來感覺很不錯,不過整體流程相對複雜一點,相當於是離線分析,不能實時進行觀測和分析。

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

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