CPU爆满问题排查

        最近一段时间忙着迁移旧服务器。其中一个服务的代码部署到新的服务器的iis上后,IIS Worker Process进程的CPU占有率蹭蹭往上涨,不一会儿就上90%。然后就开始了问题排查的过程:

        刚开始想,在原有服务器上正常,新服务器上却出问题,是不是哪些配置有问题?赶紧对比了所有相关的配置,发现并没有什么问题。那是不是与外部的接口通讯出问题了?结果发现接口正常调用。那是怎么回事呢?

        然后就去iis的请求日志文件里面查看请求耗时,发现所有请求的耗时都在7s以上,那看来是代码上的问题了。那怎么排查代码哪个地方出问题了呢?这时候就需要通过工具WinDbg进行debug,详细步骤如下:

1、生成dmp文件        

在任务管理器里面对IIS Worker Process进程创建转储文件dmp,如下图,创建过程持续时间可能比较长,完成后会提示文件存储的地址。将dmp文件复制到本地。

  2、安装WinDbg安装 WinDbg - Windows drivers | Microsoft Learn从此处开始了解 Windows 调试器和安装 WinDbg 的概述。icon-default.png?t=N7T8https://learn.microsoft.com/zh-cn/windows-hardware/drivers/debugger/?source=recommendations

3、确保本地有调试所需要的调试扩展程序

        根据服务器上的.net framework版本在C:\Windows\Microsoft.NET\Framework目录获取对应版本目录下的SOS.dll、clr.dll、mscordacwks.dll,并复制到本地。若本地已有则不需要复制。

4、开始分析

        4.1 打开WinDbg,文件—>Open Dump File,选择复制到本地的dmp文件。

        4.2 执行 .cordll -lp 3中文件所在目录,如下图

        4.3 执行 !runaway命令,分析文件。如下图:

        从里面就可以看出消耗时间较长的线程。

        4.4 通过~ (线程id)s命令进入线程,例如 ~26s。然后执行!clrstack命令查看线程执行的方法。如下图:

        从图中红框里面可以看出,是在连接redis的过程中消耗的时间很长。然后查看代码中对应的位置,发现原来是redis连接的代码有问题。每次请求都会创建一个redis连接,导致redis的连接数过多,进而导致之后请求的连接超时。在对redis的操作类进行优化后,再次部署服务,发现cpu占有率正常了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值