我最近将一组 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 相同的问题:
任何帮助深表感谢
答案1
这真的看起来有些代码陷入了无限循环。
一个请求进入,IIS 开始为其提供服务,某些东西(可能是错误)触发了这种行为,工作线程进入无限循环并将 CPU 固定在 100%,然后它会一直保持这种状态,直到应用程序池被回收。
即使没有新的请求进来,CPU 仍处于使用状态,因为卡住的线程实际上从未终止。
有时新请求会触发此行为再次,然后你得到二卡住的 CPU(或三个、四个……)。
回收应用程序池当然会终止所有工作线程,这样问题就解决了......直到它再次发生。
答案2
在 2012 上,Sharepoint 2013 和 IIS 8 遇到了完全相同的问题...我们从未排除故障,而是在 2008 R2 上降级到 SP2013,一切正常。
答案3
答案4
在我看来,这看起来像是一个无限循环。尽管 IIS 表示没有未完成的请求,但我还是多次看到这种情况。我不确定这是怎么回事,但这正是您所看到的。困难的部分是 IIS 不会在请求完成之前记录请求,因此找出哪个请求触发了此行为很困难。