案例 1:使用 ETW 追蹤和 Netsh 命令的 HTTP 逾時範例

透過 ETW 追蹤,可以檢查透過 HTTP 伺服器 API 元件的資料流程來診斷問題。 例如,Web 應用程式的使用者可能會在瀏覽器中看到網頁無法顯示的錯誤訊息。 在裝載 Web 應用程式的伺服器上,IT 專業人員也會在 HTTP 錯誤記錄檔中看到連線逾時專案,如下圖所示。 您可以在下列目錄中找到 HTTP 錯誤記錄檔: %windir%\System32\LogFiles\HTTPERR\。

顯示 netsh H T T P 命令視窗的螢幕擷取畫面,其中顯示用於逾時的 H T T P 錯誤記錄檔。

圖 1:逾時 HTTP 錯誤記錄檔

產生 ETW 追蹤報表

若要產生 HTTP 伺服器 API 元件的 ETW 追蹤報告,請從命令提示字元執行下列步驟。 在此範例中,追蹤會在伺服器上執行,因為它裝載 Web 應用程式。

下列步驟會產生名為 HTTPtrace.etl 的追蹤,然後將追蹤轉換成名為 httptrace.csv 的 CSV 檔案。 如下所示,HTTP Server API 的 ETW 提供者稱為 Microsoft-Windows-HttpService。 0xFFF命令列選項表示應該擷取此提供者的所有 ETW 事件。

產生 ETW 追蹤報表

  1. 啟動 HTTP Server 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. 檢視追蹤報表。 下表顯示 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)

  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」 的逾時。