首頁 > 軟體

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

2021-01-30 23:00:19

Windows中有一個很強大的內建工具,稱為效能監視器(Performance Counters),可讓您跟蹤很多有用的效能指標。它是免費的,且容易上手使用,但是很多人沒有很好地使用它。

這是使用效能監視器可以監視的部分內容:

  • CPU使用率
  • 記憶體使用情況
  • 程序中引發的異常數
  • ASP.NET應用程式中的請求數
  • 在ASP.NET應用程式中請求響應時間

通過它你能監視數百種具體不同的計數器。例如,假如想了解程序的記憶體使用情況,它提供了專用位元組,虛擬位元組,工作集合,工作私有集合,Gen X集合,GC中的時間百分比,大物件堆大小以及其他更多計數器。

在本文中,我們將看到如何使用PerfMon監視效能計數器,最有價值的計數器以及如何在程式碼中編寫自己的自定義計數器。

 

PerfMon中使用效能計數器

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

要實時檢視效能計數器,請單擊左側選單中的效能監視器。您可能會看到一個預設計數器Processor Time已經存在。要新增更多計數器,請單擊「 +」圖示。

 

在出現的對話方塊中,您將看到類別計數器範例三個部分。每個類別包含許多計數器。每個計數器可以包含多個範例,這些範例允許更詳細地監視該計數器。

 

 

 在上圖中,在範例範例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


IT145.com E-mail:sddin#qq.com