自定义Windows性能监视器
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 枚举