61

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

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

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

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

另外,我的一个网站应该访问管理员的桌面并读写一些文件。因此,我将其应用程序池->身份(进程模型)更改为本地系统,我不知道它是否与CPU使用率有关。

4

8 回答 8

115

诊断

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

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

服务器设置

这应该会弹出一个这样的菜单,以便您可以确定哪个 App Pool 正在运行异常。

工作进程

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

治疗

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

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

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

应用程序池高级设置

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

您可以将其添加到您的配置部分,如下所示:

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

或者,您可以使用 Powershell 的WebAdministration 模块编写脚本,如下所示:
(*确保启用了 web-scripting-tools

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

预防

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

以下是一些有关进行性能监控的资源:

于 2015-08-03T22:36:00.717 回答
16

好吧,这可能需要很长时间才能弄清楚。有几点可以缩小范围:

于 2013-03-25T20:28:44.840 回答
2

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

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

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

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

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

于 2015-03-27T21:27:05.330 回答
1

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

解决方案:

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

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

下一个。

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

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

于 2015-12-29T17:17:25.303 回答
0

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

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

于 2019-03-22T14:16:25.517 回答
-1

使用procmon来定义您的问题。

于 2013-03-25T20:25:17.307 回答
-5

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

于 2014-03-25T19:37:04.317 回答