我们有一台运行 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 扩展的字节数。此操作在每个客户端请求时发生一次。