Windows中有一個很強大的內置工具,稱爲性能監視器(Performance Counters),可以讓您跟蹤不少有用的性能指標。它是免費的,且容易上手使用,可是不少人沒有很好地使用它。app
這是使用性能監視器能夠監視的部份內容:工具
經過它你能監視數百種具體不一樣的計數器。例如,假如想了解進程的內存使用狀況,它提供了專用字節,虛擬字節,工做集合,工做私有集合,Gen X集合,GC中的時間百分比,大對象堆大小以及其餘更多計數器。性能
在本文中,咱們將看到如何使用PerfMon監視性能計數器,最有價值的計數器以及如何在代碼中編寫本身的自定義計數器。spa
在PerfMon中使用性能計數器操作系統
在Windows中監視性能計數器的主要工具是Performance Monitor(或稱PerfMon)。這個工具已經在Windows中,能夠在開始菜單中鍵入「PerfMon」或在命令行窗口中運行「 perfmon」命令來找到它。命令行
要實時查看性能計數器,請單擊左側菜單中的性能監視器。您可能會看到一個默認計數器%Processor Time已經存在。要添加更多計數器,請單擊「 +」圖標。線程
在出現的對話框中,您將看到類別,計數器和實例三個部分。每一個類別包含許多計數器。每一個計數器能夠包含多個實例,這些實例容許更詳細地監視該計數器。debug
在上圖中,在實例實例AzureStorageEmulator的全部堆中添加了#字節計數器。與許多其餘計數器同樣,在此計數器中,實例是進程。這意味着計數器將僅監測「 AzureStorageEmulator」進程的字節。調試
添加後,新計數器將出如今圖形中。您能夠更改顏色,比例,線條樣式和其餘屬性。日誌
您能夠將監視器會話保存到文件中。爲此,首先添加任何你要記錄的計數器。而後,右鍵單擊左側菜單中的「性能監視器」項目,而後選擇「新建| 數據收集器集,輸入適當的名稱並選擇日誌目錄。
新集合將出如今左側菜單 「數據收集器集」 |「用戶定義「菜單項中。若是要開始錄製,請右鍵單擊收集器集,而後選擇開始。要中止,請右鍵單擊並選擇中止。它將會建立一個.blg後綴的文件,之後能夠在PerfMon中打開該文件。
每種故障排除類型都有不一樣的重要計數器。掛起狀態的應用程序,和性能較慢的狀況,咱們將檢查不一樣的事項。同時ASP.NET也具備本身的一組計數器。
內存有3個主要類別:.NET CLR內存,用於託管內存,內存和進程。
監視內存泄漏的最佳計數器是專用字節。若是它繼續上升,那麼程序可能出現內存泄漏。若是要區分是託管內存和仍是本機內存的問題,請檢查#堆上字節數,以測量託管內存。若是它與「專用字節」一塊兒增長,則是託管內存問題。若是在「專用字節」增長時它保持穩定,那麼這就是本機內存問題。
僅當計算機上運行ASP.NET應用程序時,如下計數器纔會激活。
有關ASP.NET計數器的很是有用且通過說明的列表,請參閱Microsoft文檔中的相關文章。
.NET Framework中有一個很是簡單的API,可使用System.Diagnostics.PerformanceCounter
類來本身監視性能。這是一個例子:
1 var currentProcess = Process.GetCurrentProcess().ProcessName; 2 PerformanceCounter privateBytes = 3 new PerformanceCounter(categoryName:"Process", counterName:"Private Bytes", instanceName:currentProcess); 4 PerformanceCounter gen2Collections = 5 new PerformanceCounter(categoryName:".NET CLR Memory", counterName:"# Gen 2 Collections", instanceName:currentProcess); 6 Debug.WriteLine("private bytes = " + privateBytes.NextValue()); 7 Debug.WriteLine("gen 2 collections = " + gen2Collections.NextValue()); 8
上面的代碼簡單地獲取2個計數器的當前值並打印日誌。
建立自定義性能計數器也不太困難。我建立了一個示例,示範一個最沒用處的性能計數器。它報告當前的系統時間秒。這是代碼:
1 bool exists = PerformanceCounterCategory.Exists("MyTimeCategory"); 2 3 if (!exists) 4 5 { 6 7 PerformanceCounterCategory.Create("MyTimeCategory", "My category help", 8 9 PerformanceCounterCategoryType.SingleInstance, "Current Seconds", 10 11 "My counter help"); 12 13 } 14 15 PerformanceCounter pc = new PerformanceCounter("MyTimeCategory", "Current Seconds", false); 16 17 while (true) 18 19 { 20 21 Thread.Sleep(1000); 22 23 pc.RawValue = DateTime.Now.Second; 24 25 }
上面的代碼建立一個新的計數器(若是不存在)。在這種狀況下,它是一個單實例計數器。每秒將計數器的值更新爲系統時間秒。如今,我能夠運行代碼,打開PerfMon並添加新的計數器。結果是這樣的:
性能計數器是.NET調試和監測中很是有用的功能。儘管它們一般沒法幫助您找到問題的根本緣由,但性能計數器能夠爲咱們指明正確的方向。例如,若是您遇到性能問題,則能夠輕鬆查看它們是否與內存,CPU或異常太多等相關。
參考:michaelscodingspot