最近應用偶發性的出現cpu100%占用過高的報警,因為項目比較大,流程涉及非常多,地毯式排查已經不可能。
解決辦法目前來看最快捷的莫過於WinDbg分析dmp文件。下面詳細步驟介紹一下:
1、如何捕獲dmp文件
兩個辦法,第一個可以通過閾值的方式,讓服務器在cpu到達一定比例的時候,自動打印dmp文件,詳細見:
https://www.cnblogs.com/mamingbo/p/5656104.html
具體我們有實際操作過。
第二個辦法,是直接在服務器cpu報警100%的時候,通過任務管理器,轉存儲文件為dmp
注意上面這步驟,可能會影響正在運行的生產環境,存儲預估可能要1分鍾左右
2、將dmp文件拷貝到自己本地電腦,同時在服務器對應目錄下拷貝如下dll 所在位置:C:\Windows\Microsoft.NET\Framework?\version?\SOS.dll 同目錄下(sos.dll clr.dll mscordacwks.dll 三個dll拷貝下來)
dmp和dll拷貝到自己的本機備用,例如D:\dump\
3、安裝WinDbg,(https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/debugger-download-tools)
4、開始分析調試,打開WinDbg,文件-->Open Dump File 加載剛剛的dmp文件
第一個命令:.cordll -lp D:\dump 指向剛剛的dll所在路徑
第二個命令:!runaway,分析dmp文件
馬上可以看到哪些進程是消耗Time最長的,時間越長占用的cpu時間越久,這樣就可以分析那個線程的問題了。
例如上圖中的,19:xxxx,23:xxxx,41:xxx是時間最長的線程,下一步進入到線程里,分析是那個方法導致的
5、定位問題,首先進入線程,命令:~19,意思是19這個線程。然后執行!clrstack,問題頓顯,查看具體是哪個方法導致的。
6、至此分析結束,問題找到。同時你會發現.net framework 的GC真的是cpu大戶,盡快轉.net 5吧