一篇文章瞭解性能監視器基本使用

Windows中有一個很強大的內置工具,稱爲性能監視器(Performance Counters),可以讓您跟蹤不少有用的性能指標。它是免費的,且容易上手使用,可是不少人沒有很好地使用它。app

這是使用性能監視器能夠監視的部份內容:工具

  • CPU使用率
  • 內存使用狀況
  • 進程中引起的異常數
  • ASP.NET應用程序中的請求數
  • 在ASP.NET應用程序中請求響應時間

經過它你能監視數百種具體不一樣的計數器。例如,假如想了解進程的內存使用狀況,它提供了專用字節,虛擬字節,工做集合,工做私有集合,Gen X集合,GC中的時間百分比,大對象堆大小以及其餘更多計數器。性能

在本文中,咱們將看到如何使用PerfMon監視性能計數器,最有價值的計數器以及如何在代碼中編寫本身的自定義計數器。spa

 

PerfMon中使用性能計數器操作系統

在Windows中監視性能計數器的主要工具是Performance Monitor(或稱PerfMon)。這個工具已經在Windows中,能夠在開始菜單中鍵入「PerfMon」或在命令行窗口中運行「 perfmon」命令來找到它。命令行

要實時查看性能計數器,請單擊左側菜單中的性能監視器。您可能會看到一個默認計數器Processor Time已經存在。要添加更多計數器,請單擊「 +」圖標。線程

 

在出現的對話框中,您將看到類別計數器實例三個部分。每一個類別包含許多計數器。每一個計數器能夠包含多個實例,這些實例容許更詳細地監視該計數器。debug

 

 

 在上圖中,在實例實例AzureStorageEmulator的全部堆中添加了#字節計數器。與許多其餘計數器同樣,在此計數器中,實例是進程。這意味着計數器將僅監測「 AzureStorageEmulator」進程的字節。調試

 添加後,新計數器將出如今圖形中。您能夠更改顏色,比例,線條樣式和其餘屬性。日誌

 

 

 您能夠將監視器會話保存到文件中。爲此,首先添加任何你要記錄的計數器。而後,右鍵單擊左側菜單中的「性能監視器」項目,而後選擇「新建數據收集器集,輸入適當的名稱並選擇日誌目錄。

 

 

 新集合將出如今左側菜單 「數據收集器集」 |「用戶定義菜單項中。若是要開始錄製,請右鍵單擊收集器集,而後選擇開始。要中止,請右鍵單擊並選擇中止。它將會建立一個.blg後綴的文件,之後能夠在PerfMon中打開該文件。

有價值的調試計數器

每種故障排除類型都有不一樣的重要計數器。掛起狀態的應用程序,性能較慢的狀況,咱們將檢查不一樣的事項。同時ASP.NET也具備本身的一組計數器。

重要的CPU計數器

  • 進程處理器時間百分比(總計或每一個進程)–顯示整個計算機或特定進程的CPU使用率。能夠說明不少問題。在掛起狀態的應用程序上,若是「處理器時間」已用完,則該過程將陷入無限循環之類的CPU約束操做中。若是處理器時間爲0,則多是死鎖或卡在I / O請求上。請注意,此數字最多能夠達到100 * [邏輯CPU]。所以,當您看到100%的值時,並不意味着CPU達到極限。
  • 進程特權時間百分比–與」處理器時間百分比相似,不一樣之處在於它僅包含處理器在內核模式下花費的時間。只有核心操做系統組件和某些驅動程序才能在內核模式下運行。在這種模式下,代碼能夠執行任何操做並訪問任何內存地址。好比修改寄存器和啓用中斷。
  • 進程用戶時間百分比–與「處理器時間百分比相似,不一樣的是它僅包括處理器在用戶模式下花費的時間。也就是說,不是內核模式。
  • 處理器處理器時間百分比–顯示每一個線程而不是每一個進程的處理器時間百分比。實例表明邏輯CPU內核。

內存的重要計數器

內存有3個主要類別:.NET CLR內存,用於託管內存,內存進程

  • 專用字節–顯示已提交的進程內存(託管的和本機的)。這表示未與其餘進程共享的內存。
  • 虛擬字節–爲進程分配的虛擬內存。這既是已用內存又是保留內存。它將始終等於或大於Private Bytes。它包括共享的DLL。
  • 工做集–進程消耗的物理內存,包括其餘進程也使用的共享DLL。
  • #堆上的字節數–包括全部託管堆的總和– Gen 0 + Gen 1 + Gen 2 + LOH。這表明分配的託管內存大小。

監視內存泄漏的最佳計數器是專用字節。若是它繼續上升,那麼程序可能出現內存泄漏。若是要區分是託管內存和仍是本機內存的問題,請檢查#堆上字節數,以測量託管內存。若是它與「專用字節」一塊兒增長,則是託管內存問題。若是在「專用字節」增長時它保持穩定,那麼這就是本機內存問題。

  • Gen X集合-回收器回收的次數。值得檢查性能問題。若是很高,則可能存在內存壓力(GC壓力)問題。特別是第二代收集應該是低的,由於那些收集很是慢。

ASP.NET重要計數器

僅當計算機上運行ASP.NET應用程序時,如下計數器纔會激活。

  • Web Service \ ISAPI擴展請求數/–在ASP.NET應用程序中每秒處理的請求數。
  • 當前請求數–當前處理的請求數。正在排隊和正在執行。數字高可能代表存在問題。
  • 應用程序從新啓動–應用程序從新啓動範圍很廣,可能會致使性能問題。從新啓動多是因爲Web.configmaching.configglobal.asax修改,bin目錄的修改或其餘緣由引發的。

有關ASP.NET計數器的很是有用且通過說明的列表,請參閱Microsoft文檔中的相關文章

其餘重要計數器

  • 每秒拋出的異常數–每秒拋出大量異常會嚴重影響性能。這些一般是優先機會(已處理)異常。
  • IO數據字節數/–進程發送和接收的字節數。

性能計數器代碼

.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

相關文章
相關標籤/搜索