【问题标题】:How prevent CPU usage 100% because of worker process in iis由于iis中的工作进程,如何防止100%的CPU使用率
【发布时间】:2013-02-06 04:39:21
【问题描述】:

在使用我自己的 vps、vmware、四核和 4GB 内存的 Windows Server 2008-R2 中,我的 CPU 使用率大部分时间都是 100%。当我打开 Windows 任务管理器并转到资源监视器时,我看到 100% 的使用率是因为 workerprocess.exe。我的 IIS 中有 3 个网站。

  • 我如何确定是哪个网站导致了这种使用情况
  • 如何将其限制为 80% 的 CPU 使用率?
  • 会不会是 DDOS 攻击?
  • 有什么方法可以防止 DDOS?

我在我的 vps 上安装了 eset-nod32,但它没有在日志中显示任何攻击。我已经尝试搜索 IIS 并阻止 DDOS,并且刚刚找到了一个禁止 IP 地址的扩展,但我如何才能找到哪个 IP 地址正在产生流量?

网站是用ASP.NETC# 编写的。如何确定该网站上发生了什么以及哪些代码行导致了 CPU 使用率?

另外,我的一个网站应该访问管理员的桌面并读写一些文件。所以我把它的应用程序池->身份(进程模型)改成了本地系统,不知道是不是和CPU占用有关。

【问题讨论】:

  • 可能是你的代码?
  • 但是哪个部分和在哪里?
  • 我的意思是我怎样才能找到那些行?有什么建议吗?
  • @MoonLight 你找到解决方案了吗?我正在努力解决同样的问题。
  • 我也有同样的问题。就我而言,WCF 服务。当我发布它时它工作正常,但在某些时候它使用服务 100% CPU。我正在处理必要的对象、连接等......

标签: asp.net iis-7.5 windows-server-2008-r2 cpu-usage worker-process


【解决方案1】:

您可以看到 w3wp.exe 高 CPU 使用率的原因有很多。 我选择了六个常见的原因来涵盖。

  1. ASP.NET Web 应用程序中的高错误率
  2. 网络流量增加导致 CPU 使用率过高
  3. 应用程序依赖问题
  4. 垃圾回收
  5. 请求在 ASP.NET 管道中的某处被阻塞或挂起
  6. 需要优化的低效 .NET 代码

【讨论】:

    【解决方案2】:

    如果没有必要,请从您网站的相应应用程序池中关闭“启用 32 位应用程序”。

    这在我的本地机器上对我有用

    【讨论】:

    • 奇怪的是,将其打开似乎(到目前为止一切顺利)已经停止了特定应用程序池向北的 CPU 使用率间歇性问题。我知道一年前我们不得不这样做,但不记得为什么。
    【解决方案3】:

    嗯,这可能需要很长时间才能弄清楚。缩小范围的几点:

    【讨论】:

    • 我在 IIS 7 中遇到了同样的问题。我已经知道是哪个页面以及导致它的原因。我不知道的是为什么它只发生在 IIS 7 Windows 10 而不是任何其他 IIS 和服务器(我在其他 6 台机器 Windows 2003、2008、2012、8.1 和 7 上运行相同的代码而没有更改)跨度>
    • 在我的例子中,IIS 试图连接到 Microsoft 服务器以更新 Dot.NET 并再次编译网站。由于服务器在 Intranet 中并且无法访问 Internet,因此一直失败并重新开始。如您所见,它与代码或 AppPool 无关。无论如何,一个 sysinternal 工具来找出为什么投反对票,是个好主意!
    • @AaA 因为我们在现场为程序员服务,所以我认为 OP 问题与他的应用程序代码问题有关。高 CPU 使用率可能由任何原因引起,无论是代码、更新、IIS/Windows/驱动程序中的错误代码等。
    • @AaA 您找到问题的原因和解决方案了吗?我面临的情况有点类似。更改(升级)服务器机器和配置后 CPU 过高
    • @Amit,我的网络应用程序已编译ASP.NET Web applicastion 一位开发人员在应用程序中包含了一个“网站”样式的页面,我打开项目而不是打开网站并将页面编译到应用程序中。但我认为这与您的问题无关,您仍然需要调查该问题。为每个应用程序隔离您的 appPool,找到使用量很大的 AppPool,然后细化导致它查看 sysinternal ProcessMon 的页面
    【解决方案4】:

    诊断

    在诊断 App Pool 导致问题方面,您可以:

    1. 选择服务器
    2. 转到 IIS > 工作进程

    这应该会弹出一个类似这样的菜单,以便您可以确定哪个应用程序池正在异常运行。

    从那里您可以简单地重新启动应用程序池,然后 10 次中有 9 次将解决您遇到的任何直接问题。

    治疗

    除非您经营某种有争议的业务,否则这可能不是 DDOS 攻击。某些代码很可能只是挂起,因为它无法通过另一台服务器或卡在循环中或错误分配的资源,或者您的应用程序池有一段时间没有被回收。

    您可以通过编程方式处理此问题,而无需手动识别、登录和回收应用程序池。只需在您的应用程序池上配置CPU property。您可以在达到 CPU 阈值一段时间后让它终止(并自动重新启动)您的进程。

    在您的情况下,如果您希望它以 80% 的速度重新启动,您可以右键单击应用程序池并转到高级设置并应用以下配置:

    注意:正如kraken101 所指出的,随着时间的推移,不同的 IIS GUI 对此进行了不同的处理。虽然配置值始终为 % 的 1/1000,但有时 GUI 会占用整个百分比。

    您可以将其添加到 your config 部分,如下所示:

    <applicationPools>
       <add name="DefaultAppPool">
         <cpu limit="80000" action="KillW3wp" resetInterval="00:01:00" />
       </add>
    </applicationPools>
    

    或者,您可以使用 Powershell 的 WebAdministration Module 编写脚本,如下所示:
    (*make sure web-scripting-tools is enabled)

    Import-Module WebAdministration
    
    $appPoolName = "DefaultAppPool"
    $appPool = Get-Item "IIS:\AppPools\$appPoolName"
    $appPool.cpu.limit = 80000
    $appPool.cpu.action = "KillW3wp"
    $appPool.cpu.resetInterval = "00:01:00"
    $appPool | Set-Item
    

    预防

    上述步骤将有助于修复一些问题,但不会真正解决您遇到的任何潜在问题。

    这里有一些关于性能监控的资源:

    【讨论】:

    • 感谢@KyleMit 提供的 CPU 自动重启提示。请为其他人举手,IIS管理器中的CPU限制值(至少在IIS 7.5中)必须设置为百分比的1/1000(在IIS表单中的字段描述中提到),因此设置值到 80 (0,08%) 将导致池回收和停止,就像我喜欢的那样:)。
    • restart 你的意思是搞砸所有当前用户?
    • @Toolkit,任何等待来自超过 95% CPU 超过 2 分钟的机器响应的流量无论如何都不会做得很好,而且肯定会被超时杀死它自己的。将他们的命运掌握在自己手中并同时解决问题并不会造成任何额外的伤害。我同意会有一些伤害,只是不是说它是在取出垃圾的决定点造成的。换句话说,鉴于您的整个服务器都挂在此场景中描述的单个应用程序上,您会建议采取哪些替代纠正措施?
    • 修复导致问题的服务器和应用程序。就我而言,服务器发疯了
    • @Toolkit,但我已经在关于治疗部分的回答中解决了这个问题。显然,最好的长期解决方案是在问题出现之前预防问题,但这将根据许多不同的场景提供大量选择,并且仍然存在如何立即响应 100% CPU 负载的问题。
    【解决方案5】:

    我最近遇到了同样的问题,找到了一个对我有用的解决方案,并在很大程度上降低了内存消耗水平。

    解决方案:

    首先找到导致大量内存使用的应用程序。

    您可以在任务管理器的详细信息部分找到它。

    下一步。

    1. 打开 IIS 管理器
    2. 点击应用程序池。您会发现您的系统正在使用许多应用程序池。
    3. 现在,您可以从任务管理器中找到导致大量内存消耗的应用程序。会有多种选择,您需要选择在您的网络应用程序的应用程序列中具有“1”的选项。
    4. 当您单击右侧的应用程序池时,您会在编辑应用程序池下看到一个选项高级设置。转到高级设置。 5.现在在常规类别下将启用32位应用程序设置为True
    5. 重新启动 IIS 服务器,或者您可以在任务管理器的性能部分看到消耗下降。

    如果此解决方案适合您,请添加评论以便我知道。

    【讨论】:

    • 您可能需要检查您的应用程序是否存在内存泄漏。使用任何内存分析器来检查内存泄漏。
    • 我试过了,设置True后我的应用程序池刚刚停止
    • 我建议您使用任何 Memory Profiler 检查内存泄漏。
    【解决方案6】:

    使用 PerfMon 收集数据并使用 DebugDiag 进行分析。

    在搜索类似问题时找到此链接。

    http://www.iis.net/learn/troubleshoot/performance-issues/troubleshooting-high-cpu-in-an-iis-7x-application-pool

    【讨论】:

      【解决方案7】:

      我自己最近遇到了这个问题,一旦我确定是哪个 AppPool 导致了问题,解决问题的唯一方法就是完全删除该应用程序池并创建一个新的应用程序池供网站使用。

      【讨论】:

        【解决方案8】:

        使用procmon 来定义您的问题。

        【讨论】:

          猜你喜欢
          • 2017-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-04
          • 1970-01-01
          • 2011-05-10
          • 1970-01-01
          相关资源
          最近更新 更多