Performance Counter的使用

源文地址 html

 

一 PerformanceCounter 基本介紹
1 簡單介紹
表示 Windows NT 性能計數器組件 
命名空間:System.Diagnostics
程序集:System(在 system.dll 中)
2 構造函數(只介紹本文要用到的)
PerformanceCounter (String, String, String) 
功能:
初始化 PerformanceCounter 類的新的只讀實例,
並將其與本地計算機上指定的系統性能計數器或自定義性能計數器及類別實例關聯
參數說明:
public PerformanceCounter (
 string categoryName,
 string counterName,
 string instanceName
)
categoryName
性能計數器關聯的性能計數器類別(性能對象)的名稱。 
counterName
性能計數器的名稱。 
instanceName
性能計數器類別實例的名稱,或者爲空字符串 ("")(若是該類別包含單個實例)。
二 示例方法:
須要引用命名空間
緩存

using  System.Diagnostics;
using  System.Threading;
using  System.Collections;

1 獲取性能計數器類別列表
雖然系統中有不少可用的計數器類別,但與之交互最頻繁的多是「Cache」(緩存)、「Memory」(內存)、
「Objects」(對象)服務器

、「PhysicalDisk」(物理磁盤)、「Process」(進程)、「Processor」(處理器)、
「Server」(服務器)、「System」(系統
)和「Thread」(線程)等類別
函數

         public  static  void  GetCategoryNameList()
        {
            PerformanceCounterCategory[] myCat2;
            myCat2 
=  PerformanceCounterCategory.GetCategories();
            
for  ( int  i  =  0 ; i  <  myCat2.Length; i ++ )
            {
                Console.WriteLine(myCat2[i].CategoryName.ToString());
            }
        }

2 獲取性能計數器類別下的實例的名稱實例下的性能計數器的名稱工具

         public  static  void  GetInstanceNameListANDCounterNameList( string  CategoryName)
        {
            
string [] instanceNames;
            ArrayList counters 
=  new  ArrayList();
            PerformanceCounterCategory mycat 
=  new  PerformanceCounterCategory(CategoryName);
            
try
            {
                instanceNames 
=  mycat.GetInstanceNames();
                
if  (instanceNames.Length  ==  0 )
                {
                    counters.AddRange(mycat.GetCounters());
                }
                
else
                {
                    
for  ( int  i  =  0 ; i  <  instanceNames.Length; i ++ )
                    {
                        counters.AddRange(mycat.GetCounters(instanceNames[i]));
                    }
                }
                
for  ( int  i  =  0 ; i  <  instanceNames.Length; i ++ )
                {
                    Console.WriteLine(instanceNames[i]);
                }
                Console.WriteLine(
" ****************************** " );
                
foreach  (PerformanceCounter counter  in  counters)
                {
                    Console.WriteLine(counter.CounterName);
                }
            }
            
catch  (Exception)
            {
                Console.WriteLine(
" Unable to list the counters for this category " );
            }
        }

3 根據categoryName,counterName,instanceName得到性能狀況顯示post

         private  static  void  PerformanceCounterFun( string  CategoryName,  string  InstanceName,  string  CounterName)
        {
            PerformanceCounter pc 
=  new  PerformanceCounter(CategoryName, CounterName, InstanceName);
            
while  ( true )
            {
                Thread.Sleep(
1000 );  //  wait for 1 second 
                 float  cpuLoad  =  pc.NextValue();
                Console.WriteLine(
" CPU load =  "  +  cpuLoad  +  "  %. " );
            }
        }

4 調用方法3顯示cpu使用率性能

PerformanceCounterFun( " Processor " " _Total " " % Processor Time " );

 

 

 

Performance Counter的使用測試

 

客戶端性能測試經過performanceCounter監控客戶端性能指標ui

     PerformanceCounter PTCounter = new PerformanceCounter("Process",
                                        "% Processor Time",
                                         "AliIM");
            logfile("% Processor Time:" + PTCounter.NextValue().ToString());
            //
內存

            PerformanceCounter WSCounter = new PerformanceCounter("Process",
                                                                    "Working Set",
                                                                     "AliIM");
            logfile("Working Set:" + ((double)WSCounter.NextValue() / 1024).ToString());
this

            //內存最高值
            PerformanceCounter MemeryCounter = new PerformanceCounter("Process",
                                                                    "Working Set Peak",
                                                                     "AliIM");
            logfile("Working Set Peak:" + ((double)MemeryCounter.NextValue() / 1024).ToString());


            //
虛擬內存
            PerformanceCounter PBCounter = new PerformanceCounter("Process",
                                                              "Private Bytes",
                                                               "AliIM");
            logfile("Private Bytes:" + ((double)PBCounter.NextValue() / 1024).ToString());

            //句柄數
            PerformanceCounter HCCounter = new PerformanceCounter("Process",
                                                  "Handle Count",
                                                   "AliIM");
            logfile("Handle Count:" + HCCounter.NextValue() .ToString());

            //線程數Thread Count
            PerformanceCounter TCCounter = new PerformanceCounter("Process",
                                      "Thread Count",
                                       "AliIM");
            logfile("Thread Count:" + TCCounter.NextValue() .ToString());

//補充獲得GDI OBJECTS

            Process process;
            process = System.Diagnostics.Process.GetProcessesByName("AliIM")[0];
            
            logfile("GDI Objects Count:" + GetGuiResources(process.Handle, 0));

        [DllImport("User32")]

        extern public static int GetGuiResources(IntPtr hProcess, int uiFlags);

 

 

 

經過編碼方式使用性能計數器來進行性能計數的一個簡單例子

好比咱們有這樣一個需求:
我要編碼方式記錄咱們當前編寫的程序每秒鐘拋出異常數

若是咱們直接使用 Performance 工具,就是採用下圖方式依次選擇: 



1
、選擇要作性能測試的計算機
2
、選擇要用那個 Proformance object; 這裏咱們選擇: .NET CLR Exceptions
3
、選擇 須要的計數項,這裏咱們選 # of Exceps Thrown / sec
4
、選擇你要對那個程序進行測試(也就是那個進程產生的異常),在這裏就請選擇你要測試的程序名字

若是咱們但願用編碼方式來實現這個功能的話,也很簡單:
System.Diagnostics.PerformanceCounter 
就是編碼得到性能計數的核心
這部分的代碼以下:

System.Diagnostics.PerformanceCounter pc = new PerformanceCounter();

// 獲取或設置此性能計數器的性能計數器類別的名稱。

pc.CategoryName = ".NET CLR Exceptions";

// 獲取或設置與此 PerformanceCounter 實例關聯的性能計數器的名稱。

pc.CounterName = "# of Exceps Thrown / sec";

// 獲取或設置此性能計數器的實例名稱。

pc.InstanceName =

    System.IO.Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.SetupInformation.ApplicationName);

pc.ReadOnly = true;

 

 

Console.WriteLine(pc.RawValue);

Console.WriteLine(pc.NextValue());

int num = 30;

for (int i = 0; i < num; i++)

{

    try

    {

        throw new Exception("test Exception");

    }

    catch (Exception)

    {

    }

}

// 獲取或設置此計數器的原始值(即未通過計算的值)。

Console.WriteLine(pc.RawValue);

// 獲取計數器樣本併爲其返回計算所得值。

Console.WriteLine(pc.NextValue());

Console.WriteLine("===========");


上述代碼只是一個超簡單的例子,實際性能計數能夠寫得比這個更復雜。 
這時候,你能夠參考如下幾個類:

說明

System.Diagnostics.PerformanceCounter

表示 Windows NT 性能計數器組件。使用該類讀取現有預約義的或自定義的計數器並向自定義計數器發佈(寫入)性能數據。

System.Diagnostics.PerformanceCounterCategory

提供與計數器交互的幾種方法以及該計算機上計數器的類別。

System.Diagnostics.PerformanceCounterInstaller

指定 PerformanceCounter 組件的安裝程序。

System.Diagnostics.PerformanceCounterType

指定用於計算 PerformanceCounter  NextValue 方法的公式。




附:

咱們這個例子中須要作的性能計數器:

# of Exceps Thrown / Sec
(引起的異常數/秒) 

顯示每秒引起的異常的數目。它包括 .NET 異常和轉換成 .NET 異常的非託管異常。例如,從非託管代碼返回的 HRESULT 轉換爲託管代碼中的異常。
此計數器包括已處理和未處理的異常。此計數器不是一段時間內的平均值;它顯示在最後兩個樣本(以取樣間隔持續時間來劃分)中觀察到的值之間的差別。此計數器是一個潛在性能問題(若是引起多於 100 個的較多數目的異常)的指示器。

 

 

 

Performance Counter的使用誤區

2008-07-11 20:42

不少人在使用PerfomanceCounter的時候直接new PerfomanceCounter實例,而後就去調用NextValue()方法。這樣每每獲得的值是0.00,今天我也犯了這麼錯誤,找個了半天,終於發現,performance counter在計算值得時候,須要兩個樣本,若是咱們獲取到PerformanceCounter後直接調用NextValue()方法,則只會獲取到第一個樣本的值,該值每每會是0

下面告訴你們正確的代碼是:
PerformanceCounter pc = new PerformanceCounter();
            pc.CategoryName = cataName;
            pc.CounterName = counter;
            pc.InstanceName = instance;
            pc.MachineName = ".";
            pc.ReadOnly = true;
            
           pc.NextValue();
            System.Threading.Thread.Sleep(1000); //
1秒,讓後系統獲取下一個樣本

           return pc.NextValue();

其實,若是你的對象不銷燬,下次再獲取的時候就不會爲0了,也就不須要再sleep(1000),只要你兩次調用NextValue的時間間隔大於1秒。

相關文章
相關標籤/搜索