IIS 和 SQL CPU 使用率 100%

IIS 和 SQL CPU 使用率 100%

我们有一台运行 ASP.net 应用程序和 SQL Server 的 IIS 服务器。大多数时候它运行良好,但最近我们遇到了几次严重的性能下降情况。

整个网站变得没有响应。当我检查服务器时,CPU 以 100% 的速度运行,IIS 和 SQL 是罪魁祸首(例如 IIS 60%,SQL 40%)。

  • 重新启动服务器没有帮助,因为服务器一恢复,CPU 就回到了 100%
  • 重新启动 IIS 没有任何作用
  • 重新启动 SQL 没有任何作用
  • 这不是 DOS 攻击,因为 IIS 日志没有显示任何异常。事实上,日志中的活动量似乎并不高于正常水平。
  • 它似乎与长时间运行或未索引的查询无关,因为服务器重启可以解决这个问题。
  • 大约 25 - 30 分钟后,CPU 使用率自行恢复正常。

你听说过这样的事情吗?有什么解决办法或预防方法吗?

答案1

我在核心银行 Web 应用程序上看到过类似的问题。问题是,有时某些会话仍锁定在 ASPState 数据库中,导致每个锁定会话每秒对 dbo.TempGetStateItemExclusive3 进行数百次调用。

IIS 服务器上的 CPU 最终会随着锁定会话的数量而上升。一个临时的解决方案是回收应用程序池。

进一步在 IIS 服务器上启用跟踪,然后分析跟踪结果,您会注意到,每当 EXECUTE_REQUEST_HANDLER 模块出现问题(即导致 500 内部服务器错误的网络连接问题)时,下一个模块 RELEASE_REQUEST_STATE(应该解锁会话)都不会执行。因此会话保持锁定状态。

后来发现这是 IIS 的一个错误,我们通过在 web.config 中将 uploadReadAheadSize 的值更改为 0 来修复它:

<system.webServer>
  <serverRuntime uploadReadAheadSize="0" />
</system.webServer>

UploadReadAheadSize 属性确定 Web 服务器将读入缓冲区并传递给 ISAPI 扩展的字节数。此操作在每个客户端请求时发生一次。

相关内容