方案 1:使用 ETW 跟踪和 Netsh 命令的 HTTP 超时示例

通过 ETW 跟踪,可以检查通过 HTTP 服务器 API 组件的数据流来诊断问题。 例如,Web 应用程序的用户可以在其浏览器中看到网页无法显示的错误消息。 在托管 Web 应用程序的服务器上,IT 专业人员还会在 HTTP 错误日志中看到连接超时条目,如下图所示。 可以在以下目录中找到 HTTP 错误日志:%windir%\System32\LogFiles\HTTPERR\。

显示 netsh H T T T P 命令窗口的屏幕截图,其中显示了用于超时的 H T T P 错误日志。

图 1:超时的 HTTP 错误日志

生成 ETW 跟踪报告

若要为 HTTP 服务器 API 组件生成 ETW 跟踪报告,请从命令提示符运行以下命令。 在此示例中,跟踪在服务器上运行,因为它托管 Web 应用程序。

以下步骤生成名为 httptrace.etl 的跟踪,然后将跟踪转换为名为 httptrace.csv的 CSV 文件。 如下所示,HTTP 服务器 API 的 ETW 提供程序称为 Microsoft-Windows-HttpService。 0xFFF命令行选项指示应捕获此提供程序的所有 ETW 事件。

生成 ETW 跟踪报告

  1. 启动 HTTP 服务器 API 组件的 ETW 跟踪:logman.exe 启动 httptrace -p Microsoft-Windows-HttpService 0xFFFF -o httptrace.etl –ets
  2. 重现问题,以便可以在跟踪中捕获该问题。 在此示例中,从客户端计算机访问 Web 应用程序,导致客户端上显示“”消息。
  3. 现在问题已重现,请停止跟踪:logman.exe 停止 httptrace –ets
  4. 将报表转换为 CSV 格式:tracerpt.exe httptrace.etl -of CSV -o httptrace.csv
  5. 查看跟踪报告。 表 1 中显示了 CSV 跟踪的摘录。

查看跟踪和诊断

可以在 Excel 或任何支持 CSV 格式的工具中查看生成的跟踪 CSV 文件。 下表 1 显示了示例跟踪文件(httptrace.csv)的摘录。 在跟踪报告中,“级别”列显示值为“3”的条目,它对应于 ETW 中的警告。 HTTP 服务器 API 组件遵循 系统 ETW 提供程序事件关键字级设置中定义的 ETW 级别。 ETW 级别包括:

水平 意义
1 危急
2 错误
3 警告
4 Infomational
5 详细

 

出现此警告时,事件类型(类型列)报告“ConnTimedOut”。 在 ConnTimeOut 事件的后续列中,过期的特定计时器将报告为“Timer_ConnectionIdle”。 请注意,出于简洁起见,表中不包含带有“Timer_ConnectionIdle”条目的列,以避免摘录非连续列。

事件名称 类型 事件 ID 版本 渠道 水平
EventTrace 页眉 0 2 0 0
Microsoft-Windows-HttpService ChgUrlGrpProp 28 0 16 4
Microsoft-Windows-HttpService AddUrl 31 0 16 4
Microsoft-Windows-HttpService ChgReqQueueProp 30 0 16 4
Microsoft-Windows-HttpService ChgUrlGrpProp 28 0 16 4
Microsoft-Windows-HttpService ChgSrvSesProp 29 0 16 4
Microsoft-Windows-HttpService ChgSrvSesProp 29 0 16 4
Microsoft-Windows-HttpService ConnConnect 21 0 16 4
Microsoft-Windows-HttpService ConnIdAssgn 22 0 16 4
Microsoft-Windows-HttpService RecvReq 1 0 16 4
Microsoft-Windows-HttpService 解析 2 0 16 4
Microsoft-Windows-HttpService LogFileWrite 51 0 16 4
Microsoft-Windows-HttpService ConnCleanup 24 0 16 4
Microsoft-Windows-HttpService ConnTimedOut 53 0 16 3

 

表 1:计时器问题的示例跟踪报告摘录

在此示例中,标头计时器(Timer_ConnectionIdle)的过期(ConnTimeOut 事件)是最终用户在其 Web 客户端中看到“无法显示页面”消息的原因。 超时的一个可能原因是 Web 客户端由于连接速度缓慢而发送缓慢。 若要解决此问题,可以通过 Netsh 命令调整超时值。

通过 Netsh 调整超时并验证解决方案

下面列出的 HTTP 的 Netsh 命令允许 IT 专业人员在 HTTP 服务器 API 组件上查看和配置设置值。 通过 Netsh HTTP 命令进行的更改会影响由该计算机的 HTTP 服务器 API 组件托管的所有服务器应用程序。 这些更改在组件的重启和计算机的重启时保持不变。 Netsh HTTP 命令在 Windows Vista 和 Windows Server 2008 中可用,并在 Windows Vista 和 Windows Server 2008 上运行时替换 Windows Server 2003 资源工具包的 HttpCfg.exe 工具。 在此方案中,我们将调整超时值,然后验证解决方案。 HTTP 服务器 API 组件中存在计时器,以确保可用性并防止错误配置或恶意用户过度使用。 应根据潜在的 DoS 攻击仔细评估从默认值调整计时器。

在此示例中,Web 客户端位于网络连接缓慢的后面,导致TIMER_CONNECTIONIDLE ETW 事件。 在考虑超时的原因并平衡服务器负载的影响后,决定将超时值增加到 240 秒的值。 可以使用以下过程查看并配置计时器。

使用 Netsh 配置空闲连接计时器(Timer_ConnectionIdle)

  1. 在服务器上,打开提升的命令窗口并运行以下步骤以查看和配置超时值。 下图显示了 Netsh HTTP 命令的屏幕截图。
  2. 显示当前超时值:Netsh http 显示超时
  3. 配置Timer_ConnectionIdle超时值。 在此示例中,该值更改为 240 秒:Netsh http add timeout timeouttype=idleconnectiontimeout value=240

netsh http 命令窗口

图 2:Netsh HTTP 命令窗口

配置超时值后,重新运行 ETW 诊断步骤。 如果更正了错误条件,则 ETW 跟踪不应再显示连接空闲计时器的 ETW 级别为“3”的超时。