问题: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)