Asp.net IIS w3wp.exe占CPU100%的排查方案

最近应用偶发性的出现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吧

 

 

posted @ 2021-01-18 21:00  jackchain  阅读(1496)  评论(0编辑  收藏  举报