为什么我的 IIS6 请求在 HTTPSYS_CACHEABLE 阶段长时间冻结?

为什么我的 IIS6 请求在 HTTPSYS_CACHEABLE 阶段长时间冻结?

我的一个应用程序在系统的特定部分出现间歇性延迟。用户会点击“保存”按钮,有时需要额外 30 秒才能响应。我打开ASP.NET 跟踪然后使用Logman 和 ETW记录详细的踪迹。

跟踪显示延迟发生在“HTTPSYS_CACHEABLE”阶段。但是,我不明白为什么这会导致延迟。我没有找到有关 IIS6 中跟踪阶段的任何有用文档,Google 也没有找到其他解决此问题的人。

我尝试通过更改注册表项和编辑 machine.config 来禁用 HTTP.SYS 缓存。这两项操作均未导致页面性能或跟踪日志发生任何变化。

跟踪结果的相关部分是此部分。请注意时间戳之间的差距。

IISCache: URL_CACHE_ACCESS_END - IIS ends accessing URL cache
  ErrorCode: 0x00000000
  PhysicalPath: H:\JobTraQ_Site\
  URLInfoFromCache: 1
  URLInfoAddedToCache: 0
  ContextIDSeq: 4
  Timestamp: 00:30:29.406.250000

IISCache: HTTPSYS_CACHEABLE - IIS decides if the request is HTTP.SYS cacheable
  Reason: RESPONSE_MORE_DATA
  HttpsysCacheable: 0
  ContextIDSeq: 4
  Timestamp: 00:30:53.421.875000

答案1

我发现 URL_CACHE_ACCESS_END 跟踪条目发生在 ASP.NET 页面处理完成之前,而 HTTPSYS_CACHEABLE 发生在完成之后。我通过在代码中添加 5 秒的休眠,然后比较有休眠和没有休眠的跟踪来发现这一点。休眠的延迟出现在 HTTPSYS_CACHEABLE 时间戳中。

所以,这不是 IIS 或 ASP.NET 的问题。就我的情况而言,我们的一位开发人员更改了一些代码,导致在某些情况下运行长循环,而我们的用户恰好触发了这种情况。

相关内容