【问题标题】:IIS thread 100%, performed dump but don't know how to proceedIIS 线程 100%,执行转储但不知道如何继续
【发布时间】:2012-03-22 09:51:47
【问题描述】:

所以我的服务器最近有点疯狂,我的 IIS 线程时不时会占用我 100% 的 CPU 并挂起,直到我重新启动它。

我已经转储并找到了罪魁祸首 ASPX 页面,但是,我不知道如何从那里进一步弄清楚发生了什么。

显然我做错了什么 - 那么当 IIS 开始占用我的 CPU 时,是否有可能查看代码中运行的线程在哪里?

谢谢, 罗恩

【问题讨论】:

  • 你是怎么得到这个转储的?
  • @WEFX 这是 7 年前提出的;但我今天学到的是,您需要获得完整的内存转储(您可以创建转储规则或手动执行),然后使用完全相同的构建 PDB,我将在 Visual Studio 中打开转储并检查线程看看哪个是罪魁祸首。我们进行的每次部署都会自动保存 PDB 文件,作为自动部署过程的一部分。

标签: asp.net iis memory-leaks windows-server-2008-r2


【解决方案1】:

为了查看线程正在执行什么代码,您需要与正在运行的代码匹配的符号(.pdb 文件)。您还需要为 .NET Framework/Windows dll 设置符号。这个知识库介绍了如何做到这一点:http://support.microsoft.com/kb/311503

WinDbg 工具和 SOS.dll 调试扩展允许您找到 CPU 最高的线程!runaway,然后您可以检查堆栈!clrstack。 Tess 有一个很棒的演示,展示了如何使用它来追踪高 CPU 线程:http://blogs.msdn.com/b/tess/archive/2008/02/22/net-debugging-demos-lab-4-high-cpu-hang.aspx

【讨论】:

    【解决方案2】:

    最近,我遇到了同样的情况:我想测量我的实时生产服务器上正在发生的事情。

    我也在 Red Gate 的 ANTS Profiler 论坛上提出了这个问题,得到了great reply from the developers

    基本上是指向我的 ANTS Profiler 版本 7 的早期访问计划 (EAP) 版本。这个有一个他们称之为“连续分析”的功能,它基本上对 IIS 工作进程进行实时跟踪。

    【讨论】:

      【解决方案3】:

      这通常是在您进行闭环时 - 类似。

      function int ThisOne(int SomeVar)
      {
         return SomeVar+1;
      }
      
      function int ThisOne(int ? SomeVar)
      {
        // here you try to call the ThisOne(int SomeVar), 
        // but you call him self and crash
        return SomeVar == null ? 0 : ThisOne(SomeVar);
      }
      

      导致此错误的其他方法也会导致闭环和崩溃

      public string sMyText
      {
         get {return sMyText;}
         set {sMyText = value;}
      } 
      

      类似的问题: How do I crash the App Pool?

      IIS crashes and restarts without dropping a mini-dump

      【讨论】:

      • 我知道这是由于某种死锁造成的,我的网站比那个 sn-p 复杂一点。我需要一种方法来找出我的代码在机器上的位置;如果可能的话
      猜你喜欢
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      相关资源
      最近更新 更多