通过 ETW 跟踪,可以检查通过 HTTP 服务器 API 组件的数据流来诊断问题。 例如,Web 应用程序的用户可以在其浏览器中看到网页无法显示的错误消息。 在托管 Web 应用程序的服务器上,IT 专业人员还会在 HTTP 错误日志中看到连接超时条目,如下图所示。 可以在以下目录中找到 HTTP 错误日志:%windir%\System32\LogFiles\HTTPERR\。
图 1:超时的 HTTP 错误日志
生成 ETW 跟踪报告
若要为 HTTP 服务器 API 组件生成 ETW 跟踪报告,请从命令提示符运行以下命令。 在此示例中,跟踪在服务器上运行,因为它托管 Web 应用程序。
以下步骤生成名为 httptrace.etl 的跟踪,然后将跟踪转换为名为 httptrace.csv的 CSV 文件。 如下所示,HTTP 服务器 API 的 ETW 提供程序称为 Microsoft-Windows-HttpService。 0xFFF命令行选项指示应捕获此提供程序的所有 ETW 事件。
生成 ETW 跟踪报告
- 启动 HTTP 服务器 API 组件的 ETW 跟踪:logman.exe 启动 httptrace -p Microsoft-Windows-HttpService 0xFFFF -o httptrace.etl –ets
- 重现问题,以便可以在跟踪中捕获该问题。 在此示例中,从客户端计算机访问 Web 应用程序,导致客户端上显示“页”消息。
- 现在问题已重现,请停止跟踪:logman.exe 停止 httptrace –ets
- 将报表转换为 CSV 格式:tracerpt.exe httptrace.etl -of CSV -o httptrace.csv
- 查看跟踪报告。 表 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)
- 在服务器上,打开提升的命令窗口并运行以下步骤以查看和配置超时值。 下图显示了 Netsh HTTP 命令的屏幕截图。
- 显示当前超时值:Netsh http 显示超时
- 配置Timer_ConnectionIdle超时值。 在此示例中,该值更改为 240 秒:Netsh http add timeout timeouttype=idleconnectiontimeout value=240
图 2:Netsh HTTP 命令窗口
配置超时值后,重新运行 ETW 诊断步骤。 如果更正了错误条件,则 ETW 跟踪不应再显示连接空闲计时器的 ETW 级别为“3”的超时。