尽管没有请求,IIS 应用程序池 CPU 使用率仍然很高

尽管没有请求,IIS 应用程序池 CPU 使用率仍然很高

我最近将一组 Windows Server 2008 R2 / IIS 7.5 服务器迁移到运行 Windows Server 2012 / IIS 8 的新服务器。

我遇到了 IIS 的一些奇怪行为。我们有 2 台相同的服务器,每台服务器运行 2 个网站,每个网站都在自己的应用程序池中。每个网站的代码都是相同的。(实际上……dll 和所有内容都相同,只是配置略有不同)。

应用程序池设置为每 24 小时按计划回收一次,但在此 24 小时期间,w3wp 工作进程的 CPU 使用率以 12.5% 的增量上升(服务器有 8 个处理器,所以我不认为这是巧合)。

一旦 CPU 使用率上升,它就不会回落,直到应用程序回收。据我所知,应用程序此时什么也不做,也不处理任何请求。我可以阻止所有到服务器的流量,CPU 使用率将保持不变。我甚至可以重新启动网站,CPU 使用率保持不变。重置 CPU 使用率的唯一方法是回收或重新启动它运行的应用程序池。

我有点确定这个问题与我的代码无关,而是某种糟糕的 IIS 配置或 IIS 8 中的更改与硬件配置配合不佳或其他什么?

不确定这是否重要,但这些是 Rackspace Performance Cloud 服务器。

下面是一个屏幕截图,向您展示了这些服务器上的 CPU 负载随时间的变化(绿色箭头指向应用程序池回收的时间。您可以看到每个平台都是 12.5% 的整数倍:

在此处输入图片描述

有人观察到过这种行为吗?我从 2009 年就发现了这个问题,当时有人遇到了与 IIS 6 相同的问题:

IIS w3wp CPU 使用率高,没有流量

任何帮助深表感谢

答案1

真的看起来有些代码陷入了无限循环。

一个请求进入,IIS 开始为其提供服务,某些东西(可能是错误)触发了这种行为,工作线程进入无限循环并将​​ CPU 固定在 100%,然后它会一直保持这种状态,直到应用程序池被回收。

即使没有新的请求进来,CPU 仍处于使用状态,因为卡住的线程实际上从未终止。

有时新请求会触发此行为再次,然后你得到卡住的 CPU(或三个、四个……)。

回收应用程序池当然会终止所有工作线程,这样问题就解决了......直到它再次发生。

答案2

在 2012 上,Sharepoint 2013 和 IIS 8 遇到了完全相同的问题...我们从未排除故障,而是在 2008 R2 上降级到 SP2013,一切正常。

答案3

您可以尝试使用调试诊断工具追查问题是什么造成的。它通常用于解决崩溃和内存泄漏问题,但可以帮助找出导致问题的组件。

答案4

在我看来,这看起来像是一个无限循环。尽管 IIS 表示没有未完成的请求,但我还是多次看到这种情况。我不确定这是怎么回事,但这正是您所看到的。困难的部分是 IIS 不会在请求完成之前记录请求,因此找出哪个请求触发了此行为很困难。

相关内容