WinDbg调试分析 asp.net站点 CPU100%问题

公司为了节省成本,最近有一批服务器降了配置,CPU从8核降到了2核。本身是小站点,访问量也不高,CPU总是会飙到100%而且可以一直持续几个小时,直接强制结束进程可以维持几个小时,几个小时后又一样,运维那边总是受到cpu的警告短信很是苦恼,按理来说就算降低了配置也不至于会让CPU一直100%。

  以下就分享本次使用 WinDbg 找出 CPU 100% 问题的经验:

  1.创建Dump文件

    

  进程注意是32位的,还是64位。64位的进程可以直接创建,32位进程请使用C:\Windows\SysWOW64\taskmgr.exe 任务管理器进行创建,否则放到windbg中会报错。

  2.用windbg载入dump文件

  32位的进程使用x86的windbg加载,64为的进程使用x64的windbg来加载。下载地址https://github.com/LonelyCodelang/Tools/tree/master/Windbg_x86_x64

  

  3.配置调试环境

打开后,会显示程序当时运行所在的环境,此时,会提示符号文件没有发现:

*** ERROR: Symbol file could not be found. Defaulted to export symbols for ntdll.dll -

如果不配置,使用命令的时候会提示错误,比如:

复制代码

复制代码

0:000> .loadby sos clrjit

0:000> !tp

*** ERROR: Symbol file could not be found. Defaulted to export symbols for clr.dll -

************* Symbol Loading Error Summary **************

Module name Error

clr PDB not found : e:\appserver\symbols\dll\clr.pdb

复制代码

复制代码

e:\appserver 是我的dmp文件所在的目录,它默认是到symbols 子目录去找符号文件去了。

然后,配置下使用此文件的调试环境。

在菜单命令 File->Symbol path... 打开对话框,选择浏览,找到dmp文件所在目录相关的程序文件目录 E:\AppServer ,该目录下面有程序相关的 exe,pdb 文件。

输入下面的命令:

复制代码

复制代码

0:000> .sympath+ c:\symbols

Symbol search path is: E:\AppServer;c:\symbols

Expanded Symbol search path is: e:\appserver;c:\symbols

Error: Attempts to access 'c:\symbols' failed: 0x2 - 系统找不到指定的文件。

************* Symbol Path validation summary **************

Response Time (ms) Location

OK E:\AppServer

Error

复制代码

复制代码

这里不用管,这个文件夹后面可以生成。

复制代码

复制代码

0:000> .symfix

0:000> .symfix+ c:\symbols

0:000> .sympath

Symbol search path is: srv*

Expanded Symbol search path is: SRVc:\symbolshttp://msdl.microsoft.com/download/symbols

************* Symbol Path validation summary **************

Response Time (ms) Location

Deferred

复制代码

复制代码

这下对了。

执行下 reload命令:

0:000> .reload

................................................................

................................................................

............

接着执行下面:

复制代码

复制代码

0:000> .loadby sos clr

0:000> !tp

The version of SOS does not match the version of CLR you are debugging. Please

load the matching version of SOS for the version of CLR you are debugging.

CLR Version: 4.0.30319.296

SOS Version: 4.6.96.0

Failed to load data access DLL, 0x80004005

复制代码

复制代码

这里提示说SOS的版本更CLR不匹配,这里需要找到当时生成Dump文件所在的服务器上的 sos.dll,注意,因为服务器程序是64位的,所以必须在 .Net Framework64 目录去找,同时把 mscordacwks.dll 文件一起拷贝过来(先暂时不用,下面马上会讲到)。

刚才这个命令执行后,我们惊喜的发现,c:\symbols 目录自己创建了,并且下载了 clr.pdb等几个目录,这是再将刚才服务器上拷贝的 sos.dll, mscordacwks.dll ,放到本地机器的 c:\symbols 目录下面。

再次执行这几个命令:

复制代码

复制代码

0:000> .reload

................................................................

................................................................

............

0:000> .loadby sos clr

0:000> !tp

The version of SOS does not match the version of CLR you are debugging. Please

load the matching version of SOS for the version of CLR you are debugging.

CLR Version: 4.0.30319.296

SOS Version: 4.6.96.0

Failed to load data access DLL, 0x80004005

复制代码

复制代码

还是报错,看来 sos.dll 没有加载正确,用下面的命令:

0:000> .load c:\symbols\sos.dll

0:000> .loadby sos clr

0:000> !tp

这里load命令必须带SOS.dll的路径。加载了它,然后执行 .loadby sos clr ,表示调试.NET托管程序。

开始漫长的等待,程序窗口提示:

BUSY

Downloading symbols for [clr.pdb] /

等到相关的符号文件全部下载完毕,终于出现了久违的成功界面:

复制代码

复制代码

CPU utilization: 11%

Worker Thread: Total: 8 Running: 0 Idle: 8 MaxLimit: 32767 MinLimit: 8

Work Request in Queue: 0

Number of Timers: 14

Completion Port Thread:Total: 1 Free: 1 MaxFree: 16 CurrentLimit: 0 MaxLimit: 1000 MinLimit: 8

复制代码

复制代码

  4.找出占用CPU最多的Thread,并切换到改Thread

  使用!runaway 找出每个Thread消耗的cpu时间。下图最耗时的线程ID是17,造成CPU100%的就是此线程。

  

  ~17s

    切换到此线程

  5.使用 !clrstack 列出 Thread 27 的 Callstack

从这里就可以定位到具体的方案,是RabbitMQ消费方法的线程造成的,具体就可以看内部方法的实现,然后进行优化。

相关参考文章:

https://blogs.msdn.microsoft.com/tess/2010/09/29/capturing-memory-dumps-for-32-bit-processes-on-an-x64-machine/

https://www.cnblogs.com/bluedoctor/p/4813125.html

https://stackoverflow.com/questions/16422577/sos-does-not-support-the-current-target-architecture/16422887

WinDbg调试分析 net站点 CPU100%问题的更多相关文章

  1. 使用Windbg和SoS扩展调试分析.NET程序

    在博客堂的不是我舍不得 - High CPU in GC(都是+=惹的祸,为啥不用StringBuilder呢?). 不是我舍不得 - .NET里面的Out Of Memory 看到很多人在问如何分析 ...

  2. 调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令

    调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (二)使用Windbg调试SQLSERVER ...

  3. 调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置

    调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (三)使用Windbg调试SQLSERVER ...

  4. WinDbg调试.NET程序入门

    俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinDbg工具远程帮我分析了一个 dum ...

  5. 使用WinDbg调试SQL Server——入门

    这篇文章我想探究下SQL Server里完全不同的领域:如果使用WinDbg(来自针对Windows的调试工具)调试SQL Server.在我们进入枯涩细节之前,我想详细解释下为什么选择这样晦涩的话题 ...

  6. windbg调试C#代码(一)

    用windbg调试C#代码是比较麻烦的,因为windbg是针对OS层级的,而C#被CLR隔了一层,很多原生的命令如查看局部变量dv.查看变量类型dt等在CLR的环境中都不能用了.必须使用针对CLR的扩 ...

  7. WinDbg调试.NET

    WinDbg调试.NET程序入门 俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinD ...

  8. 用Windbg来分析.Net程序的dump

    介绍 1. 什么是Windbg WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件. WinDbg是微 ...

  9. windbg调试实例(4)--句柄泄露

    同事介绍了一篇调试句柄泄露的blog文章,今天有空看了一下,这家伙用视频的方式录下整个调试的过程,学习一目了然,真是有心.鉴于学习的过程总结一下能加深记忆,所以我这里做个记录,感兴趣的朋友可以看这里: ...

随机推荐

  1. Hadoop-hdfs安装与配置

    一.安装要求   安装JDK   yum -y install jdk(或手动安装)  设置namenode节点到datanode节点的免密码登陆   a. 本地免密码登录     # ssh loc ...

  2. Eigen--简单的C++矩阵计算库

    晚上突然想写一段小C++程序,要用到矩阵求逆呀乘法呀之类的,所以找了一下有什么现成的可用的C++矩阵计算相关的库,发现有一大堆,在其中各种各样的配置,感觉比较麻烦.从方便性来说Eigen是最方便的了, ...

  3. HDU 1025 Constructing Roads In JGShining's Kingdom[动态规划/nlogn求最长非递减子序列]

    Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65 ...

  4. 玲珑杯 Round #5 Problem E Tetration (枚举 + 欧拉公式)

    题目链接  Tetration 题意  给定一个排列  现在可以任意调整这个排列的顺序 求$a_{1}^{a_{2}^{a_{3}^{...^{a_{n}}}}}$对$p$取模的最小值 直接枚举$a$ ...

  5. Codeforces 785D Anton and School - 2(推公式+乘法原理+组合数学)

    题目链接 Anton and School - 2 对于序列中的任意一个单括号对(), 左括号左边(不含本身)有a个左括号,右括号右边(不含本身有)b个右括号. 那么答案就为 但是这样枚举左右的()的 ...

  6. usaco-Subset Sums

    题意: 给出一个1-n的数列,求把它分为两组数使得两组数的和相等的方案数. 分析: 如果可能分成两组,那么(n+1)n/2一定为偶数,且n%4=2或3.可以设dp[i][j]表示从1-i中的数拼出的方 ...

  7. Akka之Actor生命周期

    我们首先来看一下官方给出的Actor的声明周期的图: 在上图中,Actor系统中的路径代表一个地方,其可能会被活着的Actor占据.最初路径都是空的.在调用actorOf()时,将会为指定的路径分配根 ...

  8. 2016集训测试赛(二十四)Problem C: 棋盘控制

    Solution 场上的想法(显然是错的)是这样的: 我们假设棋子是一个一个地放置的, 考虑在放置棋子的过程中可能出现哪些状态. 我们令有序整数对\((i, j)\)表示总共控制了\(i\)行\(j\ ...

  9. Maven出现错误No plugin found for prefix 'jetty' in the current project and in the plugin groups的问题解决

    只需在maven的setting.xml文件上加入如下节点: <pluginGroups> <pluginGroup>org.mortbay.jetty</pluginG ...

  10. Timeout watchdog using a standby thread

    http://codereview.stackexchange.com/questions/84697/timeout-watchdog-using-a-standby-thread he simpl ...