Windows 性能監視器是一個很好用的自帶監視工具,對於一些基本簡單的監視需求可以輕松滿足。本文主要總結了一下如何將自己應用中的一些性能數據暴露到性能監視器上方便管理。
什么?不知道什么是Windows性能監視器?
“Microsoft 管理控制台 (MMC) 管理單元,提供用於分析系統性能的工具。僅從一個單獨的控制台,即可實時監視應用程序和硬件性能,自定義要在日志中收集的數據,定義警報和自動操作的閾值,生成報告以及以各種方式查看過去的性能數據。” - MSDN[1]
使用場景
需要記錄自己開發的應用中一些性能方面的數據,比如說我有一個 WCF的應用,我需要記錄下來每分鍾應用處理的請求數量,請求的平均處理時間。通過這些數據可以用來對應用進行監控,也可以進行一些分析。如果將這些數據儲存成自己的形式將會帶來很多其他的工作,如果暴露給性能監視器的話就要簡單很多。
使用方法
關鍵類型:
PerformanceCounterCategory:這個對應着監視器上的一個組,可以包含很多個計數器( Counter)
CounterCreationData:定義計數器的名稱和一些幫助字符串的類,主要是在創建的時候用到。
PerformanceCounterType:每一個計數器都需要制定一個類型,這個枚舉提供了所有的計數器類型。參考 MSDN可以看到每一個類型的適用范圍以及這個類型的計算公式。[3]
PerformanceCounter:這個是真正去暴露數據的類型,通過這個類型我們可以將我們統計到的數據暴露給性能監視器。
步驟:
寫了一個例子用來記錄操作總數。
一、 創建自定義類型並添加到系統中:
private const string CategoryName = "Sample Category";
private const string CategoryHelp = "This is just a sample Category";
private const string TotalOperationName = "Total Operation Counter";
private const string TotalOperationHelp = "Count of Total Operation";
//檢測系統中是否已經存在這個類別 //如果需要修改這個類別里面的內容的話就需要刪除重新添加這里刪除是為了 if (PerformanceCounterCategory.Exists(CategoryName)) PerformanceCounterCategory.Delete(CategoryName); //創建你需要的計數器 CounterCreationDataCollection collection = new CounterCreationDataCollection(); CounterCreationData totalOperation = new CounterCreationData(TotalOperationName, TotalOperationHelp, PerformanceCounterType.NumberOfItems32); collection.Add(totalOperation); //調用Create 方法在你本地電腦注冊這個計數器類別以及其中的一些計數器 PerformanceCounterCategory.Create(CategoryName, CategoryHelp, PerformanceCounterCategoryType.SingleInstance, collection);
注意點:
1. 強烈建議在應用安裝或者部署的時候創建計數器類別,而不是在運行時進行添加。因為如果運行時添加的話可能性能監視器來不及刷新,從而導致出錯。[2]
2. 創建計數器類別需要管理員權限,這也從另一個方面說明最好在安裝或者部署的時候創建,因為極有可能運行的時候是沒有管理員權限的。
3. 選擇PerformanceCounterType的時候最好去MSDN上去找一個最適合你需求的那個類型。[3]
二、運行時創建PerformanceCounter
PerformanceCounter m_totalOperationCounter = new PerformanceCounter(CategoryName, PerformanceCounterTotalOperationName, false);
注意點:
1. 通過類別名和計數器名從系統中找到之前我們注冊過的計數器,最后一個參數設為false因為我們需要進行寫操作。
2. 這個類除了可以用來寫計數器以外還可以從系統中讀取某一個指定的計數器,比如說CPU的使用率,內存使用率等數據。
3. 除了可以從本地電腦讀取性能參數以外,還可以從局域網中的其他電腦中讀取數據。
三、寫入數據
運行時根據自己的需要去改變那個計數器,可以通過調用Increment等方法對計數器進行自增,也可以直接給RawData進行賦值(但是要注意線程安全)
for (int i = 0; i < 100; i++) { //這是我自己封裝的一個方法 PerfCounterSample.Instance.IncreaseOpCounter(); //模擬處理 Thread.Sleep(new Random().Next(2000)); } public void IncreaseOpCounter() { m_totalOperationCounter.Increment(); }
還有另一種比較好的方式就是不直接操作計數器,而是將數據記錄在一個地方,然后定時的去刷新到計數器中。
for (int i = 0; i < 100; i++) { count++; //模擬處理 Thread.Sleep(new Random().Next(2000)); }
Timer m_Timer = new Timer(); m_Timer.AutoReset = true; m_Timer.Interval = 1000.0;//1 Second m_Timer.Elapsed += new ElapsedEventHandler(Timer_Elapsed); m_Timer.Start();
void Timer_Elapsed(object sender, ElapsedEventArgs e) { lock (m_totalOperationCounter) { m_totalOperationCounter.RawValue = count; } }
注意點:
1. 我覺得這里主要是要注意線程安全和這個最終計數器數值的運算方式(這個要看你的需求啦)。
四、在性能監視器中添加我們的計數器
首先運行程序去系統中注冊我們的計數器,然后打開性能監視器將我們的計數器加到監視列表中。
大功告成啦!
Reference:
1. MSDN,Windows 性能監視器概述
2. MSDN,PerformanceCounterCategory.Create
3. MSDN,PerformanceCounterType 枚舉