案例 1:使用 ETW 追蹤和 Netsh 命令的 HTTP 逾時範例
透過 ETW 追蹤,可以檢查透過 HTTP Server API 元件的數據流來診斷問題。 例如,Web 應用程式的使用者可能會在瀏覽器中看到網頁無法顯示的錯誤訊息。 在裝載 Web 應用程式的伺服器上,IT 專業人員也會在 HTTP 錯誤記錄檔中看到連線逾時專案,如下圖所示。 您可以在下列目錄中找到 HTTP 錯誤記錄檔:%windir%\System32\LogFiles\HTTPERR\。
圖 1:逾時 HTTP 錯誤記錄檔
產生 ETW 追蹤報表
若要產生 HTTP 伺服器 API 元件的 ETW 追蹤報告,請從命令提示字元執行下列步驟。 在此範例中,追蹤會在伺服器上執行,因為它裝載 Web 應用程式。
下列步驟會產生名為 HTTPtrace.etl 的追蹤,然後將追蹤轉換成名為 httptrace.csv的 CSV 檔案。 如下所示,HTTP Server API 的 ETW 提供者稱為 Microsoft-Windows-HttpService。 0xFFF命令行選項表示應該擷取此提供者的所有 ETW 事件。
產生 ETW 追蹤報表
- 啟動 HTTP Server 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
- 檢視追蹤報表。 CSV 追蹤的摘錄如下表 1 所示。
檢視追蹤和診斷
產生的追蹤 CSV 檔案可以在 Excel 或任何支援 CSV 格式的工具中檢視。 下表 1 顯示範例追蹤檔案 (httptrace.csv) 的摘錄。 在追蹤報告中,[層級] 資料行會顯示值為 「3」 的專案,其對應於 ETW 中的警告。 HTTP Server API 元件遵循 系統 ETW 提供者事件關鍵詞層級設定中所定義的 ETW 層級,。 ETW 層級包括:
水準 | 意義 |
---|---|
1 | 危急 |
2 | 錯誤 |
3 | 警告 |
4 | Infomational |
5 | 詳細 |
使用此警告時,事件類型 (Type 數據行) 會報告 「ConnTimedOut」。 在 ConnTimeOut 事件的後續數據行中,過期的特定定時器會回報為「Timer_ConnectionIdle」。 請注意,為了簡潔起見,數據表中不包含具有 「Timer_ConnectionIdle」 項目的數據行,並避免摘錄非連續數據行。
事件名稱 | 類型 | 事件標識碼 | 版本 | 管道 | 水準 |
---|---|---|---|---|---|
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 Server 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” 的逾時。