作者:Jim Cheshire
此疑難解答中使用的工具:
- 除錯診斷1.2
- 效能監視器
此材料僅供參考。Microsoft不作任何明示或暗示的保證。
概觀
此問題排查工具將幫助您識別IIS應用程式池中持續存在的高CPU的原因。重要的是要記住,隨著Web應用程式提供請求,CPU使用率正常增加。但是,如果您始終認為CPU長時間保持在高水平(在80%或更高的區域),您的應用程式的效能將會受到影響。因此,瞭解持續高CPU的原因很重要,以便可以解決和糾正
指令碼
IIS中的應用程式池遇到長時間超過90%的高CPU。當測試應用程式時,不會遇到任何問題。然而,一旦應用程式遇到實際的使用者負載,CPU將爬升到很高的百分比並保持不變。要恢復,應該重新啟動應用程式池,但是在這樣做之後,CPU再次爬上高層。
資料採集
遇到高CPU時,首先應該做的是確定正在消耗CPU的程式。您可以使用工作管理員中的程式選項卡來執行此操作。確保您檢查顯示所有使用者的程式核取方塊。圖1顯示了此框,並顯示了w3wp.exe程式(承載IIS應用程式池的程式),消耗高階別的CPU。
圖1 - 工作管理員顯示高CPU。
您還可以使用效能監視器來確定使用CPU的程式。有關使用效能監視器的更多資訊,請參閱此故障排除程式中稍後分析效能資料。
小費
如果您需要確定哪個應用程式池與特定的w3wp.exe程式相關聯,請開啟管理命令提示符,切換到該%windir%\System32\inetsrv資料夾cd %windir%\System32\inetsrv並執行appcmd list wp。這將以引號顯示w3wp.exe程式的程式識別符號(PID)。您可以將該PID與工作管理員中可用的PID相匹配。
一旦您確認w3wp.exe程式遇到高CPU,您將需要收集兩條資訊,以確定導致問題的原因。
- 效能監視器資料收集器集。
- w3wp.exe程式的使用者模式記憶體轉儲。
這些都將需要在高CPU事件期間收集。
收集效能監視器資料收集器集
效能監視器(Perfmon)資料對於確定高CPU問題的原因往往至關重要。獲取應用程式執行的“大圖”檢視也是非常有用的。
可以實時檢視Perfmon資料,也可以將其收集到資料收集器集中,以便稍後進行檢視。為了排除高CPU問題,我們需要收集資料收集器集。要建立用於排除高CPU故障的資料收集器集,請按照下列步驟操作。
- 從Windows控制皮膚開啟管理工具。
- 雙擊效能監視器。
- 展開“資料收集器集”節點。
- 右鍵單擊“使用者定義”,然後選擇“新建”,“資料收集器集”。
- 輸入高CPU作為資料採集器的名稱。
- 選擇手動建立(高階)單選按鈕。
- 點選下一步。
- 選擇建立資料日誌單選按鈕。
- 檢查效能計數器核取方塊。
- 點選下一步。
-
單擊新增按鈕。
如果您的應用程式不是ASP.NET應用程式,請繼續執行步驟19。
- 滾動到計數器列表的頂部,然後選擇.NET CLR記憶體。
- 在例項列表中,選擇<all instances>。
- 單擊新增按鈕將計數器新增到新增的計數器列表。
- 從計數器列表中選擇ASP.NET,然後單擊新增。
- 從計數器列表中選擇ASP.NET應用程式。
- 從例項列表中選擇<all instances>。
- 單擊新增。
- 從計數器列表中展開“處理”。(確保展開Process而不是處理器。)
- 從Process物件中選擇%Processor Time。
- 從例項列表中選擇<all instances>。
- 單擊新增。
- 從計數器列表中展開執行緒。
- 從Thread物件中選擇%Processor Time。
- 從例項列表中選擇<all instances>。
- 單擊新增。
- 從例項列表中選擇ID執行緒。
- 單擊新增。
您的對話方塊現在應該如圖2所示。
圖2 - 建立資料收集器集。
單擊確定按鈕,然後單擊下一步按鈕。記下儲存資料收集器的位置。(如果需要,可以更改此位置。)然後單擊完成。
資料收集器集尚未執行。要啟動它,請右鍵單擊使用者定義節點下的高CPU,然後從選單中選擇開始。
建立除錯診斷1.2規則
發生高CPU狀況時收集使用者模式程式轉儲的最簡單方法是使用Debug Diagnostics 1.2或DebugDiag。您可以從以下URL下載DebugDiag。
https://www.microsoft.com/download/en/details.aspx?id=26798
在您的伺服器上安裝DebugDiag 1.2並執行它。(安裝後您將在開始選單中找到它。)執行DebugDiag時,將顯示“選擇規則型別”對話方塊。按照以下步驟為應用程式池建立崩潰規則。
- 選擇效能並單擊下一步。
- 選擇效能計數器,然後單擊下一步。
- 單擊新增Perf觸發器。
- 展開Processor(而不是Process)物件並選擇%Processor Time。請注意,如果您在Windows Server 2008 R2上,並且有超過64個處理器,請選擇Processor Information物件而不是Processor物件。)
- 在例項列表中,選擇_Total。
- 單擊新增,然後單擊確定。
- 選擇新新增的觸發器,然後單擊編輯閾值,如圖3所示。
- 在下拉選單中選擇上方。
- 將閾值更改為80。
- 輸入20秒的秒數。(如果需要,您可以調整此值,但請注意不要指定少量秒鐘以防止發生錯誤觸發。)
- 單擊確定。
- 點選下一步。
- 單擊新增轉儲目標。
- 從下拉選單中選擇Web應用程式池。
- 從應用程式池列表中選擇您的應用程式池。
- 單擊確定。
- 點選下一步。
- 再次點選下一步。
- 如果您希望輸入規則的名稱,並記下要儲存轉儲的位置。如果需要,您可以更改此位置。
- 點選下一步。
- 選擇啟用規則,然後單擊完成。
小費
您可以使用與步驟13-15中使用相同的技術新增多個轉儲目標來建立多個應用程式池的轉儲。
圖3 - 在DebugDiag中新增perf觸發器。
此規則將建立11個轉儲檔案。前10名將是“小型轉儲”,規模相當小。最後的轉儲將是一個具有完整記憶體的轉儲,並且轉儲將會更大。
一旦發生高CPU問題,您將要停止收集資料的Perfmon資料收集器集。為此,請右鍵單擊使用者定義節點下列出的高CPU資料收集器集,然後選擇停止。
資料分析
在高CPU事件之後,您將有兩組要檢視的資料; Perfmon資料收集器集和記憶體轉儲。我們先來看一下Perfmon的資料。
分析效能資料
要檢視您的問題的Perfmon資料,請右鍵單擊使用者定義節點下列出的高CPU資料收集器集,然後選擇最新報告。您會看到類似於圖4所示的螢幕。
圖4 - Perfmon顯示高CPU資料。
首先要刪除所有當前的計數器,以便您可以新增要檢視的顯式計數器。選擇列表中的第一個計數器。然後滾動到列表的底部,然後在按住鍵盤上的Shift鍵的同時單擊最後一個計數器。選擇所有計數器後,按鍵盤上的Delete鍵將其刪除。
現在使用這些步驟新增Process /%Processor Time計數器。
- 右鍵單擊Perfmon右窗格中的任意位置,然後選擇新增計數器。
- 展開Process物件。
- 從列表中選擇%Processor Time。
- 從例項列表中選擇<all instances>。
- 單擊新增。
- 單擊確定。
現在將顯示一個顯示資料收集器集執行時計算機上每個程式使用的處理器時間的圖形。隔離哪個程式使用最高階別CPU的最簡單的方法是啟用Perfmon的高亮功能。
為此,請選擇列表中的第一個計數器,然後按Ctrl + H。完成此操作後,所選的過程將在圖形上顯示為粗體黑線。
使用鍵盤上的向下箭頭向下移動程式列表,直到找到顯示最多CPU使用率的程式。在圖5中,您可以清楚地看到w3wp.exe程式在計算機上使用了大量的CPU。這證實IIS應用程式池在計算機上造成高CPU利用率。
圖5 - 顯示w3wp.exe的CPU使用情況的Perfmon。
小費
Perfmon可以在確定應用程式中的效能問題方面非常有用。Perfmon日誌中收集的資料可以顯示您正在執行的請求數量(使用ASP.NET和ASP.NET應用程式物件),還可以向您顯示有關應用程式執行情況的其他重要效能資料。
要解決導致高CPU問題的根源,我們來看看使用DebugDiag建立的轉儲。
使用DebugDiag進行轉儲分析
DebugDiag可以通過進行自動轉儲分析來識別許多問題。對於這個特殊問題,DebugDiag的效能分析器非常適合幫助確定高CPU問題的根本原因。要使用分析儀,請按照下列步驟操作
- 選擇DebugDiag中的Advanced Analysis選項卡。
- 選擇效能分析儀。
- 單擊新增資料檔案。
- 瀏覽到建立轉儲的位置。預設情況下,這將是資料夾的子C:\Program Files\DebugDiag\Logs資料夾。
- 選擇一個轉儲,然後按Ctrl + A選擇該資料夾中的所有轉儲。
- 單擊開啟。
- 單擊開始分析。
DebugDiag將需要幾分鐘的時間來解析轉儲並提供分析。完成分析後,您將看到類似於圖6所示的頁面。
圖6 - DebugDiag分析報告。
請注意,報告的頂部告訴您檢測到高CPU。在右欄中,您會看到建議,其中包括平均CPU時間前7位執行緒的連結。點選該連結,您將看到有關這些頂級CPU消費者在做什麼的資訊。圖7顯示了我的應用程式中這些執行緒正在做什麼。
圖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高。有關詳細資訊,請參閱Microsoft知識庫中的https://support.microsoft.com/kb/307340。
結論
通過使用Perfmon和DebugDiag,您可以輕鬆收集有助於確定應用程式池中高CPU的原因的資料。如果您無法使用這些技術找到根本原因,您可以通過https://support.microsoft.com/與Microsoft開啟支援票據,我們可以幫助您確定問題的原因。當您開啟案例時,通過將Perfmon資料和轉儲準備給我們,您將大大減少我們協助您所需的時間。