.NET 效能測試工具 -- 效能計數器
阿新 • • 發佈:2019-01-23
內容預告:
- Windows內建工具(效能計數器)
- 事件跟蹤器
- 時間分析
- 記憶體分配分析
- 記憶體使用量分析
- 其他分析
效能計數器:直接win+R執行 perfmon.exe 即可開啟。可以在以下場景下使用:
- 如果發現有記憶體洩露,效能計數器可以被用來檢查託管還是本地記憶體分配的問題。Process\Private Bytes可以檢視所有程序分配的private記憶體(包括GC堆)和.NET CLR Memory\# Bytes in All Heaps可以檢視託管記憶體。
- 如果ASP.NET程式有反常的行為,在ASP.NET目錄下可以看詳細資訊,比如請求時間, 請求超時時間, 請求等待時間, 請求執行時間等計數器可以確認負載情況。Errors Total/Sec可以檢視程式非正常的異常計數,各種cache可以檢視快取是否有效利用。
- 如果WCF中嚴重依賴資料庫並且分散式事務處理失敗的話,ServiceModelService目錄可以查明問題。Calls Outstanding, Calls Per Second, and Calls Failed Per Second等計數器可以定位負載,Transactions Flowed Per Second計數器報告事務數量,SQL SERVER目錄的MSSQL$INSTANCENAME:Transactions 和MSSQL$INSTANCENAME:Locks可以看出事務執行的問題,比如過多的鎖,以及死鎖。
自定義效能計數器的日誌和警告:(筆者的電腦是win8)。步驟如下:
- 在效能計數器的左邊,展開Data Collector Sets。
- 依次是User Defined -> 右鍵 -> new - >Data Collector Sets。
- 輸入自定義的名稱,,選擇Create manually(Advanced)【手動建立(高階)】,NEXT
- 選擇 Create Data Logs,選中Performance counter,NEXT
- 選擇目錄,NEXT
- 選擇 Open properties for this data collector set,NEXT
- 繼續配置其他資訊,然後OK
- 選中剛才自定義的結點,右鍵-> start
- 即開始運行了,也可以右鍵->stop停止
- 可以通過右鍵Latest Report匯出報告。
- 在結果視窗可以新增或刪除計數器。
自定義效能計數器:你可以通過.NET的System.Diagnostics.PerformanceCounter類獲取效能資料。下面是需要自定效能計數器的場景:
- 開發大型系統時,用一個基礎庫用來彙報效能資料,可以方便在程式碼級別輸出效能資訊。
- 開發伺服器系統時,有響應客戶端請求,處理請求,返回資料的功能,應該彙報請求的處理率,錯誤計數等類似的統計資訊做為效能資訊彙報出來。
- 開發高可靠性Windows服務且關聯硬體時,應該彙報硬體的執行狀況資訊,以及和硬體間的互動等資料。
下面的程式碼會輸出一個單例項的效能計數器資料並定時更新:
public static void CreateCategory() { if (PerformanceCounterCategory.Exists("Attendance")) { PerformanceCounterCategory.Delete("Attendance"); } CounterCreationDataCollection counters = new CounterCreationDataCollection(); CounterCreationData employeesAtWork = new CounterCreationData( "# Employees at Work", "The number of employees currently checked in.", PerformanceCounterType.NumberOfItems32); PerformanceCounterCategory.Create( "Attendance", "Attendance information for Litware, Inc.", PerformanceCounterCategoryType.SingleInstance, counters); } public static void StartUpdatingCounters() { PerformanceCounter employeesAtWork = new PerformanceCounter( "Attendance", "# Employees at Work", readOnly: false); updateTimer = new Timer(_ = > { employeesAtWork.RawValue = AttendanceSystem.Current.EmployeeCount; }, null, TimeSpan.Zero, TimeSpan.FromSeconds(1)); }
雖然效能計數器很不錯,但是不能用在高效能的程式裡。接下來介紹事件跟蹤器。