1. 程式人生 > >.NET 效能測試工具 -- 效能計數器

.NET 效能測試工具 -- 效能計數器

內容預告:

  • 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)。步驟如下:

  1. 在效能計數器的左邊,展開Data Collector Sets。
  2. 依次是User Defined -> 右鍵 -> new - >Data Collector Sets。
  3. 輸入自定義的名稱,,選擇Create manually(Advanced)【手動建立(高階)】,NEXT
  4. 選擇 Create Data Logs,選中Performance counter,NEXT
  5. 選擇目錄,NEXT
  6. 選擇 Open properties for this data collector set,NEXT
  7. 繼續配置其他資訊,然後OK
  8. 選中剛才自定義的結點,右鍵-> start
  9. 即開始運行了,也可以右鍵->stop停止
  10. 可以通過右鍵Latest Report匯出報告。
  11. 在結果視窗可以新增或刪除計數器。

自定義效能計數器:你可以通過.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));
}

雖然效能計數器很不錯,但是不能用在高效能的程式裡。接下來介紹事件跟蹤器。