昨天使用 WinDbg 追查 ASP.NET CPU 100% 原因的文章得到不少朋友的回饋,其中 Robert Hu 留言提到一個更方便的 Dump 擷取與問題分析工具,試用之下果然犀利,在此補上介紹。
Debug Diagnostic Tool (DebugDiag) 是微軟針對程式當掉(Crash)、當住(Hang),以及記憶體洩漏(Memory Leak)等問題設計的快速偵察工具,目前最新版為 Debug Diagnostic Tool v2 Update 2,共有三項兵器:
DebugDiag 2 Collection
自動化蒐集 Dump 檔的工具,可針對不同情境指定抓取 Dump 時機,例如:程式拋出非預期的例外、效能計數器達到門檻、HTTP 回應時間過慢、監測記憶體用量改變… 等,功能強大。
DebugDiag Collection 最強悍之處在於設定規則守株待兔,當程序 CPU 使用量或其他效能指標超過門檻時匯出 Dump 檔(注意:匯出 Dump 期間程序會暫停,將影響線上使用者),對付「ASP.NET 不定期 CPU 飆高」之類的問題格外有用!
下圖範例即為主機 CPU 使用百分比超過 30% 連續五秒時產生一到多個 AppPool Process 的 Dump 檔,有助於抓出耗用 CPU 的網站程式。DebugDiag2 RuleBuilder
若 DebugDiag 2 Collection 預設抓取規則不夠用,Rule Builder 支援以視覺化流程圖方式自訂規則。DebugDiag 2 Analysis
自動 Dump 分析工具,針對當機、當住及記憶體洩漏等情境預先寫好分析邏輯,輸入一個或多個 Dump 檔後自動產生分析報表。上回說到的 ASP.NET CPU 100% 問題,使用 PerfAnalysis 可以瞬間找到答案。
操作方法很簡單,如上圖所示,按下 Start Analysis,選好 Dump 檔,DebugDiag Analysis 就開始分析,稍待約一分鐘(運算時間長短視 Dump 大小、數量、分析項目而定)熱騰騰的分析報表網頁就出爐了。在報表尋找 Analysis Details /PerfAnalysis / Performance Summary / Statistical Rollups / Top 1 Operations By Duration,相當於用 WinDbg 尋找耗用 CPU 最久的 Thread 的分析資料,而共用元件呼叫 ODP.NET OracleCommand.ExecuteReader 的 Callstack 資料就在眼前。
使用 DebugDiag Analysis,只需幾個 Click 就能得到與 WinDbg 一連串指令操作相當的結果。若 WinDbg 是傳統單眼,DebugDiag Analysis 就像傻瓜相機,管它什麼快門調多快光圈開多大,按下快門就有好照片,還附贈美肌效果,神奇無比。
至於這兩種工具的選擇,若目的在檢視問題 Thread 當下的 Callstack,要「快」請用 DebugDiag Analysis,要「帥」就用 WinDbg 吧!哈。