最近应用偶发性的出现cpu100%占用过高的报警,因为项目比较大,流程涉及非常多,地毯式排查已经不可能。
解决办法目前来看最快捷的莫过于WinDbg分析dmp文件。下面详细步骤介绍一下:
1、如何捕获dmp文件
两个办法,第一个可以通过阈值的方式,让服务器在cpu到达一定比例的时候,自动打印dmp文件,详细见:
https://www.cnblogs.com/mamingbo/p/5656104.html
具体我们有实际操作过。
第二个办法,是直接在服务器cpu报警100%的时候,通过任务管理器,转存储文件为dmp
注意上面这步骤,可能会影响正在运行的生产环境,存储预估可能要1分钟左右
2、将dmp文件拷贝到自己本地电脑,同时在服务器对应目录下拷贝如下dll 所在位置:C:WindowsMicrosoft.NETFramework?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吧