自定义Windows性能监视器
Windows?性能監(jiān)視器是一個很好用的自帶監(jiān)視工具,對于一些基本簡單的監(jiān)視需求可以輕松滿足。本文主要總結了一下如何將自己應用中的一些性能數(shù)據(jù)暴露到性能監(jiān)視器上方便管理。
什么?不知道什么是Windows性能監(jiān)視器?
“Microsoft?管理控制臺?(MMC)?管理單元,提供用于分析系統(tǒng)性能的工具。僅從一個單獨的控制臺,即可實時監(jiān)視應用程序和硬件性能,自定義要在日志中收集的數(shù)據(jù),定義警報和自動操作的閾值,生成報告以及以各種方式查看過去的性能數(shù)據(jù)。”?- MSDN[1]?
使用場景
需要記錄自己開發(fā)的應用中一些性能方面的數(shù)據(jù),比如說我有一個?WCF的應用,我需要記錄下來每分鐘應用處理的請求數(shù)量,請求的平均處理時間。通過這些數(shù)據(jù)可以用來對應用進行監(jiān)控,也可以進行一些分析。如果將這些數(shù)據(jù)儲存成自己的形式將會帶來很多其他的工作,如果暴露給性能監(jiān)視器的話就要簡單很多。
使用方法
關鍵類型:
PerformanceCounterCategory:這個對應著監(jiān)視器上的一個組,可以包含很多個計數(shù)器(?Counter)
CounterCreationData:定義計數(shù)器的名稱和一些幫助字符串的類,主要是在創(chuàng)建的時候用到。
PerformanceCounterType:每一個計數(shù)器都需要制定一個類型,這個枚舉提供了所有的計數(shù)器類型。參考?MSDN可以看到每一個類型的適用范圍以及這個類型的計算公式。[3]
PerformanceCounter:這個是真正去暴露數(shù)據(jù)的類型,通過這個類型我們可以將我們統(tǒng)計到的數(shù)據(jù)暴露給性能監(jiān)視器。
步驟:
寫了一個例子用來記錄操作總數(shù)。
一、 創(chuàng)建自定義類型并添加到系統(tǒng)中:
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";
//檢測系統(tǒng)中是否已經存在這個類別//如果需要修改這個類別里面的內容的話就需要刪除重新添加這里刪除是為了if (PerformanceCounterCategory.Exists(CategoryName))PerformanceCounterCategory.Delete(CategoryName);//創(chuàng)建你需要的計數(shù)器 CounterCreationDataCollection collection = new CounterCreationDataCollection();CounterCreationData totalOperation =new CounterCreationData(TotalOperationName, TotalOperationHelp, PerformanceCounterType.NumberOfItems32);collection.Add(totalOperation);//調用Create 方法在你本地電腦注冊這個計數(shù)器類別以及其中的一些計數(shù)器 PerformanceCounterCategory.Create(CategoryName,CategoryHelp,PerformanceCounterCategoryType.SingleInstance,collection);
注意點:
1. 強烈建議在應用安裝或者部署的時候創(chuàng)建計數(shù)器類別,而不是在運行時進行添加。因為如果運行時添加的話可能性能監(jiān)視器來不及刷新,從而導致出錯。[2]
2. 創(chuàng)建計數(shù)器類別需要管理員權限,這也從另一個方面說明最好在安裝或者部署的時候創(chuàng)建,因為極有可能運行的時候是沒有管理員權限的。
3. 選擇PerformanceCounterType的時候最好去MSDN上去找一個最適合你需求的那個類型。[3]
二、運行時創(chuàng)建PerformanceCounter
PerformanceCounter m_totalOperationCounter = new PerformanceCounter(CategoryName, PerformanceCounterTotalOperationName, false);注意點:
1. 通過類別名和計數(shù)器名從系統(tǒng)中找到之前我們注冊過的計數(shù)器,最后一個參數(shù)設為false因為我們需要進行寫操作。
2. 這個類除了可以用來寫計數(shù)器以外還可以從系統(tǒng)中讀取某一個指定的計數(shù)器,比如說CPU的使用率,內存使用率等數(shù)據(jù)。
3. 除了可以從本地電腦讀取性能參數(shù)以外,還可以從局域網中的其他電腦中讀取數(shù)據(jù)。
三、寫入數(shù)據(jù)
運行時根據(jù)自己的需要去改變那個計數(shù)器,可以通過調用Increment等方法對計數(shù)器進行自增,也可以直接給RawData進行賦值(但是要注意線程安全)
for (int i = 0; i < 100; i++){//這是我自己封裝的一個方法 PerfCounterSample.Instance.IncreaseOpCounter();//模擬處理 Thread.Sleep(new Random().Next(2000));} public void IncreaseOpCounter(){m_totalOperationCounter.Increment();}還有另一種比較好的方式就是不直接操作計數(shù)器,而是將數(shù)據(jù)記錄在一個地方,然后定時的去刷新到計數(shù)器中。
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. 我覺得這里主要是要注意線程安全和這個最終計數(shù)器數(shù)值的運算方式(這個要看你的需求啦)。
四、在性能監(jiān)視器中添加我們的計數(shù)器
首先運行程序去系統(tǒng)中注冊我們的計數(shù)器,然后打開性能監(jiān)視器將我們的計數(shù)器加到監(jiān)視列表中。
?
大功告成啦!
?
示例代碼:
?
Reference:
1. MSDN,Windows?性能監(jiān)視器概述
2. MSDN,PerformanceCounterCategory.Create
3. MSDN,PerformanceCounterType 枚舉
轉載于:https://www.cnblogs.com/imjustice/p/custome_windows_performance_monitor.html
總結
以上是生活随笔為你收集整理的自定义Windows性能监视器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FreeSql (一)入门
- 下一篇: Python Django 学习笔记