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 @   jackchain  阅读(1584)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2014-01-18 基于Cookie的购物车
点击右上角即可分享
微信分享提示