問題:git
web服務器w3wp CPU佔用率很是高,致使整個服務器CPU 100%佔用,問題沒法正常重現github
解決方法:web
--問題還沒有解決,此處記錄目前的解決狀態安全
1)下載windbg 服務器
參考https://blog.csdn.net/johnsonblog/article/details/8165861工具
最終的下載地址:spa
http://download.microsoft.com/download/A/6/A/A6AC035D-DA3F-4F0C-ADA4-37C8E5D34E3D/setup/WinSDKDebuggingTools_amd64/dbg_amd64.msi.net
2)將windlb安裝在服務器(本地也能夠),內存轉儲文件可能很大(G級別),推薦直接安裝在服務器,避免複製dmp文件線程
默認目錄爲:C:\Program Files\Debugging Tools for Windows (x64)debug
3)建立進程轉儲問題,找到cpu佔用最高的w3wp,右鍵,建立轉儲文件,若成功,則會提示轉儲文件的地址,通常放在C:\Users\Administrator\AppData\Local\Temp\X
4) 用windbg打開轉儲文件分析,打開的菜單爲Fille->Open Crash Dump 或者按Ctrl + D
5) 輸入命令分析,找到正在執行的代碼
參考:https://improve.dk/debugging-in-production-part-1-analyzing-100-cpu-usage-using-windbg/
概要:
在打開的窗口下面的輸入框中依次輸入:
加載dotNet分析工具: !loadby sos clr
查到正在運行的線程: !runaway
運行這個命令後,找到執行時間最長的線程,通常是第一個,找到線程的id
選擇線程,輸入:~Xs 將X換成線程Id
加載線程的調用堆棧:!CLRStack
如今能夠看到代碼了。
---
服務器dump了一個,CLRStatck的時候報錯:
PDB symbol for clr.dll not loaded,查看資料是 mscordacwks.dll版本不匹配,研究了半天,沒搞定
https://github.com/Microsoft/WinObjC/wiki/Debugging-Stack-Traces-from-Crash-Dumps
最後,安裝了Windbg Preview(直接在win10市場中安裝),用其打開dump文件,輸入幾個命令後,它本身下載了符號文件,命令終於能夠運行了。
最終發現問題是老代碼有個地方用到了靜態的Dictionary<>,Dictionary<>不是線程安全的,不該該做爲靜態字段用在web程序中。
000000397797d7c0 00007ffdabdb8d2e System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].FindEntry(System.__Canon) 000000397797d830 00007ffd519cca81 ModelBLL.GetModel(System.String)