我有一组非常强大但利用率很低的服务器,它们运行着几个装有 Windows Server 2008 R2 和 IIS 7.5 的虚拟机。
问题:有时请求需要很长时间才能处理。用户会发现浏览器在旋转,似乎没有收到来自 IIS 的任何响应。
一些统计数据和解决尝试:
- 服务器(主机和虚拟机)上的负载可以忽略不计。CPU 从未超过 5%,有 10+ GB 的 RAM 可用,所有设备都通过 MPIO 连接到快速 SAN。
- 我每秒收到 30 到 50 个请求,混合了动态和静态内容,只有 GET 和 POST。大多数命中都被缓存(命中率为 80%),因此结构/SAN/IO 上的负载几乎为零。
- 主机和虚拟机上的 TCP 卸载均已禁用,无论是在网络适配器上还是通过禁用 TCP 烟囱
- Web 应用程序在 ASP.NET 4.0 集成模式下运行。它们不会长时间调用第三方 Web 服务或类似服务。
- 我已经尝试了 processModel autoConfig,以及将 maxWorkerThreads、maxConnections、maxIOThreads 等设置为非常高的数字,但没有任何区别。
- 数据库查询全部在 1 秒内完成。我分析了一整天,没有发现任何耗时更长的查询。
- 我查看了大量性能监视器计数器;ASP.NET 队列和应用程序队列始终为空,似乎没有任何内容排队(考虑到服务器根本没有出汗,这无论如何都没有意义)
- 我发现使用 appcmd 列表请求时,请求有时会在 IIS 的“SendResponse”阶段“卡住” 20-60 秒。这是目前为止我能找到的唯一能解释为什么用户在浏览时卡住的原因。请注意,大多数请求都得到了快速处理,看起来就像来自不同应用程序池的随机请求在这里卡住了。
知道我还能看什么吗?什么会导致请求卡在 IIS 中的“SendResponse”阶段?
答案1
您找到解决方案了吗?一段时间以来,我经常看到同样的情况,即 JS、PNG 和 GIF 等静态内容在“IIS Web Core”模块中停留在“SendResponse”状态。我在 IIS 7/ASP.NET 4.0 中也遇到了同样的情况。我正在使用此 Microsoft.Web.Administration 代码,而不是 appcmd。
更新:经过进一步研究,我发现一种可能性是网络连接中断。在此主题,该人在他的 IIS 日志中报告了 Win32 状态代码 1236,即“网络连接被本地系统中止。”。但我不确定这是否意味着请求者取消了请求,或者 Web 服务器已中止请求。可以想象,请求者可能会在所有这些针对页面内容(图像、JS 等)的 HTTP 请求完成之前导航到您网站上的另一个页面,这可能会中止对 Web 服务器的所有待处理请求(即,他在页面首次呈现时单击页面上的链接)。我在 IIS 日志中发现了一些 1236 Win32 状态代码(主要是针对 GIF、PNG 和 JS 等静态内容,其中一些与 ASPX 页面相关),但是,我不确定这些是否是我看到的卡在“SendResponse”状态的相同请求。
答案2
这通常是由于移动设备在数据连接速度较慢的情况下下载大型资产文件造成的。我说的“大型”是指相对于连接速度而言。
这些请求并不是“挂起”,只是需要很长时间,因为它们取决于用户的网络速度。如果用户断开连接,这些请求将被丢弃,因此他们可能正在耐心等待页面加载。
检查“挂起”请求旁边列出的IP并查找,您可能会发现它们属于移动电话运营商。
答案3
想分享我最近遇到的与您描述的相同症状的经历。我们定期遇到请求挂起的情况,浏览器似乎要等待很长时间(超过 10 秒,最多约 100 秒)才能收到随机请求。这种情况发生在静态内容请求和动态内容请求中。在使用与您相同的方法(appcmd 列表请求)观察请求后,我发现它们会卡在 SendResponse 中。
为了复制该问题,我会对一个小型静态 .jpg 文件循环发送 100,000 个请求,并可以生成数千个 1236 个响应(通过检查 IIS 日志进行验证)。
禁用 Windows Defender 实时扫描后,我的 100k 请求测试生成了 0 1236 个响应。 在我们的 UAT 环境中,我们每天在 iis 日志中收到大约 10-100 个 1236 错误(大约 50 万个请求)。禁用 Windows Defender 实时扫描后,我们现在没有收到任何传入请求的 1236 win32status。