針對 IIS 應用程式集區中的高 CPU 進行疑難解答
適用於:網際網路資訊服務
此疑難解答員可協助您識別 網際網路資訊服務 (IIS) 應用程式集區中持續高 CPU 的原因。 請務必記住,當 Web 應用程式提供要求時,CPU 使用量會正常增加。 不過,如果您持續看到 CPU 持續處於較高層級(在 80% 或更高區域中),則應用程式效能會受到影響。 因此,請務必了解持續高 CPU 的原因,以便盡可能加以解決和更正。
案例
IIS 中的應用程式集區遇到長時間超過 90% 的高 CPU。 測試應用程式時,不會發生任何問題。 不過,一旦應用程式遇到實際的用戶負載,CPU 就會攀升至高百分比並維持不變。 若要復原,應用程式集區必須重新啟動,但在這麼做之後,CPU 會再次攀升至高階。
工具
- 偵錯診斷 (DebugDiag)
- 效能監視器 (Perfmon)
資料收集
遇到高 CPU 使用量問題時,您應該做的第一件事是判斷耗用 CPU 的進程。 您可以使用 [任務管理員] 中的 [行程 ] 索引標籤來執行此動作。 請確定您選取 [從所有使用者顯示處理程式] 複選框。 下圖顯示此方塊已核取,並顯示 w3wp.exe
取用高階CPU的進程(裝載 IIS 應用程式集區的進程)。
您也可以使用 效能監視器 來判斷使用 CPU 的進程。 如需使用 效能監視器 的詳細資訊,請參閱分析效能數據。
提示
如果您需要識別哪些應用程式集區與特定w3wp.exe進程相關聯,請開啟系統管理命令提示字元,切換至 %windir%\System32\inetsrv
資料夾 cd %windir%\System32\inetsrv
並執行 appcmd list wp
。 這會以引號顯示w3wp.exe進程的進程標識碼(PID)。 您可以比對該 PID 與任務管理器中可用的 PID。
確認w3wp.exe進程遇到高 CPU 之後,您必須收集下列資訊,才能判斷造成問題的原因:
- 效能監視器 數據收集器集。
- w3wp.exe進程的使用者模式記憶體轉儲。
這兩者都需要在高 CPU 事件期間收集。
收集 效能監視器 數據收集器集
效能監視器 數據在判斷高 CPU 問題的原因時通常很重要。 它對於取得應用程式執行方式的「大局」檢視也非常有説明。
Perfmon 數據可以實時檢視,也可以在稍後檢閱的數據收集器集中收集。 若要針對高 CPU 問題進行疑難解答,我們需要收集數據收集器集。 若要建立數據收集器集以針對高 CPU 進行疑難解答,請遵循下列步驟。
- 從 Windows 控制台 開啟 [系統管理工具]。
- 按兩下 效能監視器。
- 展開 [ 數據收集器集合 ] 節點。
- 以滑鼠右鍵按兩下 [使用者定義 ],然後選取 [新增 -> 資料收集器集]。
- 輸入 高 CPU 作為數據收集器集的名稱。
- 選取 [手動建立] [進階]。
- 選取 [下一步]。
- 選取 [ 建立數據記錄]。
- 選取 [ 性能計數器] 複選框。
- 選取 [下一步]。
- 選取 [新增]。 如果您的應用程式不是 ASP.NET 應用程式,請繼續進行步驟 19。
- 捲動至計數器清單頂端,然後選取 [.NET CLR 記憶體]。
- 在實例清單中,選取所有實例>。<
- 選取 [新增 ] 以將計數器新增至新增的計數器清單。
- 從計數器清單中選取 [ASP.NET ],然後選取 [ 新增]。
- 從計數器清單中選取 [ASP.NET 應用程式 ]。
- 從實例>清單中選取<所有實例。
- 選取 [新增]。
- 從計數器清單中展開 [處理 ]。 (請確定您展開 處理 而非 Processor。)
- 從 Process 物件選取 %Processor Time。
- 從實例>清單中選取<所有實例。
- 選取 [新增]。
- 從計數器清單中展開 Thread 。
- 從 Thread 物件選取 %Processor Time。
- 從實例>清單中選取<所有實例。
- 選取 [新增]。
- 從實例清單中選取 [標識符線程 ]。
- 選取 [新增]。
您的對話框現在看起來應該像下圖。
選取 [確定] ->[下一步]。 記下正在儲存數據收集器集的位置。 (如有需要,您可以變更此位置。然後選取 [ 完成]。
數據收集器集合尚未執行。 若要啟動它,請以滑鼠右鍵按兩下 [使用者定義的] 節點底下的 [高 CPU],然後從功能表中選取 [開始]。
建立偵錯診斷規則
發生高 CPU 狀況時,收集使用者模式進程傾印最簡單的方式是使用偵錯診斷。
下載DebugDiag,將其安裝在您的伺服器上並加以執行。 (您會在 安裝之後的 [開始 ] 功能表。當您執行 DebugDiag 時,它會顯示 [ 選取規則類型 ] 對話方塊。 請遵循下列步驟來建立應用程式集區的當機規則:
- 選取 [效能 -> 下一步]。
- 選取 性能計數器 ->Next。
- 選取 [ 新增效能觸發程式]。
- 展開 [ 處理器 ] (而非 [行程] 對象,然後選取 [% 處理器時間]。 請注意,如果您在 Windows Server 2008 R2 上,而且您有超過 64 個處理器,請選擇 [處理器資訊 ] 物件,而不是 Processor 物件。
- 在實例清單中,選取 [_Total]。
- 選取 [ 新增 -> 確定]。
- 選取新增的觸發程式,然後選取 [ 編輯臨界值]。
- 在下拉式清單中選取 [上方 ]。
- 將臨界值變更為 80。
- 輸入 20 秒數。 (您可以視需要調整此值,但請小心不要指定少量秒,以防止誤觸發程式。
- 選取 [確定]。
- 選取 [下一步]。
- 選取 [新增傾印目標]。
- 從下拉式清單中選取 [Web 應用程式集區 ]。
- 從應用程式集區清單中選取您的應用程式集區。
- 選取 [確定]。
- 選取 [下一步]。
- 再次選取 [下一步]。
- 如果您想要的話,請輸入規則的名稱,並記下將儲存傾印的位置。 如有需要,您可以變更此位置。
- 選取 [下一步]。
- 選取 [ 立即啟用規則],然後選取 [ 完成]。
提示
您可以使用步驟 13-15 中使用的相同技術,新增多個傾印目標,以建立多個應用程式集區的傾印。
此規則會建立11個傾印檔案。 前10個將是「迷你傾印」,大小相當小。 最後傾印會是具有完整記憶體的傾印,而傾印將會更大。
發生高 CPU 問題之後,您會想要停止 Perfmon 數據收集器集合收集數據。 若要這樣做,請以滑鼠右鍵按兩下 [用戶定義的] 節點底下所列的高 CPU 資料收集器集,然後選取 [停止]。
資料分析
高 CPU 事件之後,您將有兩組要檢閱的數據:Perfmon 數據收集器集和記憶體傾印。 讓我們從檢閱 Perfmon 數據開始。
分析效能資料
若要檢閱問題的 Perfmon 數據,請以滑鼠右鍵按兩下 [用戶定義] 節點下所列的高 CPU 資料收集器集,然後選取 [最新報告]。 您會看到類似下列螢幕快照的報表。
第一件事是移除所有目前的計數器,以便新增您想要檢閱的明確計數器。 選取清單中的第一個計數器。 然後捲動到清單底部,然後在按住 SHIFT 鍵時選取最後一個計數器。 選取所有計數器之後,請按 [刪除] 鍵將其移除。
現在,使用下列步驟新增 Process / % Processor Time 計數器:
- 以滑鼠右鍵按兩下 Perfmon 右窗格中的任何位置,然後選取 [ 新增計數器]。
- 展開 Process 物件。
- 從清單中選取 %Processor Time 。
- 從實例清單中選取所有實例>。<
- 選取 [新增]。
- 選取 [確定]。
您現在會有一個顯示,顯示計算機上每個進程在執行數據收集器集時所使用的處理器時程圖表。 隔離使用最高 CPU 層級之進程最簡單的方式,就是啟用 Perfmon 的醒目提示功能。
若要這樣做,請選取清單中的第一個計數器,然後按 Ctrl + H。完成此動作之後,選取的程式會在圖形上顯示為粗體黑色線條。
使用鍵盤上的向下箭號來向下移動進程清單,直到您找到顯示最大CPU使用量的進程為止。 在下列螢幕快照中,您可以清楚地看到w3wp.exe進程在機器上使用大量 CPU。 這可確認 IIS 應用程式集區造成電腦上的 CPU 使用率偏高。
提示
Perfmon 對於判斷應用程式中的效能問題非常有用。 Perfmon 記錄檔中收集的數據會顯示有多少要求正在執行(使用 ASP.NET 和 ASP.NET Applications 物件),也可以顯示應用程式執行方式的其他重要效能數據。
若要取得造成高 CPU 問題的根目錄,讓我們檢閱使用 DebugDiag 建立的傾印。
使用DebugDiag進行傾印分析
DebugDiag 能夠藉由執行自動化傾印分析來辨識許多問題。 針對此特定問題,DebugDiag 的 效能分析器 很適合用來協助找出高 CPU 問題的根本原因。 若要使用分析器,請遵循下列步驟
- 在 DebugDiag 中選取 [ 進階分析] 索引標籤。
- 選取 效能分析器。
- 選取 [ 新增數據檔]。
- 瀏覽器到建立傾印的位置。 根據預設,這會是 C:\Program Files\DebugDiag\Logs 資料夾的子資料夾。
- 選取其中一個傾印,然後按 Ctrl + A 以選取該資料夾中的所有傾印。
- 選取開啟。
- 選取開始分析。
DebugDiag 需要幾分鐘的時間來剖析傾印並提供分析。 完成分析時,您會看到類似下圖所示的頁面。
請注意,報表頂端會指出偵測到高 CPU。 在右側數據行中,您會看到建議,其中包含平均 CPU 時間前 7 個線程的連結。 選取該連結,您會看到這些頂級 CPU 取用者所執行作業的相關信息。 例如,下列螢幕快照顯示這些線程在我的應用程式中執行的動作。
在此範例中, FastApp 應用程式中default.aspx 頁面正在執行。 如果您進一步查看呼叫堆疊(位於頁面底部),您可以看到此線程正在執行字串串連。 (請注意呼叫堆棧上的 呼叫 System.String.Concat
。如果您分析其他頂級 CPU 線程,您會看到相同的模式。
下一個步驟是在 FastApp 應用程式的 default.aspx 頁面中檢閱Page_Load
事件。 當我這樣做時,我發現下列程序代碼。
htmlTable += "<table>";
for (int x = 0; x < 5000; x++)
{
htmlTable += "<tr>" + "<td>" + "Cell A" + x.ToString() + "</td>";
htmlTable += "<td>" + "Cell B" + x.ToString() + "</td>" + "</tr>";
}
htmlTable += "</table>";
這類程序代碼一定會造成高CPU。
推論
藉由使用 Perfmon 和 DebugDiag,您可以輕鬆地收集數據,以利判斷應用程式集區中高 CPU 的原因。 如果您無法使用這些技術找到根本原因,您可以連絡Microsoft支持人員以取得進一步的協助。 Microsoft支援工程師可協助您判斷問題的原因。 藉由在開啟案例時備妥 Perfmon 資料和傾印,您將大幅減少工程師協助您所需的時間量。