案例 1:使用 ETW 追蹤和 Netsh 命令的 HTTP 逾時範例
透過 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 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 追蹤的摘錄。
檢視追蹤和診斷
追蹤產生的 CSV 檔案可以在 Excel 或任何支援 CSV 格式的工具中檢視。 下表 1 顯示範例追蹤檔案 (httptrace.csv) 的摘錄。 在追蹤報表中,[層級] 資料行會顯示值為 「3」 的專案,其對應于 ETW 中的警告。 HTTP 伺服器 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:計時器問題的範例追蹤報表摘要
在此範例中,標頭計時器 () 的 ConnTimeOut 事件到期 (Timer_ConnectionIdle) 是使用者在其 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 Resource Kit 的 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」 的逾時。