Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 303|回复: 0

Windbg+Procdump解决w3wp.exe CPU过百问题

[复制链接]
  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 773 天

    [LV.10]以坛为家III

    2045

    主题

    2103

    帖子

    71万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    713646
    发表于 2021-5-21 08:23:09 | 显示全部楼层 |阅读模式

    最近发布在windows  server2012  IIS8.0上的一个WebAPI项目,才几十个人在线,CPU就会出现过百情况,并且CPU一旦过百应用程序池就自动暂停掉,看到这个问题我感觉应该是程序哪个地方出了问题, 8盒16G 应该配置还是可以的。打算使用windbg找到这个问题。

     

    为了快速定位问题我就直接在生产环境安装了windbg,为了采集dump文件,我选择Procdump。Procdump无需安装,下载下来直接放到一个目录下即可。以下是解决问题的过程+截图:

     

     

    步骤一:

    安装windbg,注意32和64,要安装相应的版本,直接点击下一步即可。

     

    步骤二:

    Copy Procdump 文件到服务器上的一个目录下,目录没有限制

    如图:C:\software\Procdump,这里的dbghelp.dll是从windbg安装目录下copy过来的,是我为了解决下面这个坑:调试High CPU问题的时候经常用到的一个命令是!runaway,但是有些时候!runway在ProcDump抓取的dump中提取不出来。解决的方法是将Debug Tools for Windows (windbg)安装目录下的dbghelp.dll拷贝到procdump目录下,然后再运行命令抓取dump。 

    0:000> !runaway ERROR: !runaway: extension exception 0x80004002.    

    "Unable to get thread times - dumps may not have time information"

     

     

     

     

     

     

    步骤三:

    在doc窗口下执行procdump命令,cd /d c:\Software\Procdump

     

     

    步骤四:

    执行procdum命令,执行 procdump -c 50 -s 4 -ma -n 3 w3wp    命令含义为:当w3wp.exe  cpu超过50%,并且持续4秒,抓取3个dump文件存储起来,存储位置默认为procdump文件所在的目录。

    如图:

     

    出现如图结果证明已经进入监控状态。接下来就是等着CPU超过50%了。

     

    没过一会就看到效果了

     

    dump文件已经抓取到,我们来看下dump文件存储位置:

     

    那么接下来就是开始分析了。

     

    步骤五:

    启动已经安装好的Windbg,开始分析采集的dump文件

     

    步骤六:

    为了不影响正在运行的项目,我将发布的项目文件单独从copy了一份出来,如图所示:我是web api项目

     

    步骤七:

    设置系列目录:

    Windbg->file->Symbol File Path

     

     

    Windbg->file->Source File Path

     

    步骤八:

    加载dump文件

    Windbg->file->open Crash Dump

     

    先选择第一个dump文件。

     

     

    步骤九:

    载入sos.dll  执行.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.DLL

    我是4.0 的 注意版本 64位

     

    步骤十:

    !threadpool  查看当前CPU状况 线程数等等 

     

     

    步骤十一:

    执行 !runaway 命令  查看那几个线程使用的高

     

     

    步骤十二:

    ~线程IDs 跳转到那个线程

     

    步骤十三:

    !clrstack 看看这个线程再干嘛 执行那些方法

     

    步骤十四:

    将图中红框列出来的方法去项目中查找下,发现了问题:

     

     

    重载方法的时候参数传递不正确,出现了死循环,至此问题得到了解决。

    原文出处:http://www.mamingbo.com/page/yunwei/109/index.htm

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-8-13 13:12 , Processed in 0.059182 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表