利用Windows性能计数器(PerformanceCounter)监控 分类: windows驱动程序WDM VC++ 2015-03-10 10:44 369人阅读 评论(0) 收藏

1、概述编程

性能监视,是Windows NT提供的一种系统功能。Windows NT一直以来老是集成了性能监视工具,它提供有关操做系统当前运行情况的信息,针对各类对象提供了数百个性能计数器。性能对象,就是被监视的对象,典型例子有Processor、Process、Memory、TCP/UDP/IP/ICMP、PhysicalDisk等。计数器一般提供操做系统、应用程序、服务、驱动程序等的性能相关信息,以此来分析系统瓶颈和对系统及应用程序性能进行诊断和调优。性能计数器机制让应用程序和操做系统组件能够向性能监视应用程序,好比性能监视器(Performance Monitor),报告一些与性能有关的统计信息。PerfMon.exe中能够查看性能对象、性能计数器和对象实例,可经过添加计数器来查看相关描述信息。服务器

实际上,能够经过编写程序来访问全部的Windows性能计数器。Windows中,注册表是访问性能计数器的一种机制。性能信息并不实际存在于注册表中,在注册表编辑器RegEdit.exe中是没法查看的,但能够经过注册表函数来访问,利用注册表键来得到从性能数据提供者那里提供的数据。打开名为HKEY_PERFORMANCE_DATA的特殊键,利用RegQueryValueEx函数查询键下面的值,就能够直接访问注册表性能计数器信息。固然,也能够利用性能数据帮助器(PDH, Performance Data Helper) API (Pdh.dll)来访问性能计数器信息。架构

性能日志和警报是做为 Windows 操做系统的一部分发行的一种管理性能监控工具。它依靠由各类 Windows 组件、子系统和应用程序发布的性能计数器,使您能够跟踪资源使用状况以及针对时间以图形方式绘制它们。您可使用 Performance Logs and Alerts 来监控标准的性能计数器(例如,内存使用状况或处理器使用状况),或者您能够定义您本身的自定义计数器来监控应用程序特定的活动。编辑器

2、HKEY_PERFORMANCE_DATA数据组织函数

性能数据的头部是一个PERF_DATA_BLOCK结构(如图1所示),它描述系统和性能数据整体信息,可从Global键值处查询获得该结构数据。PERF_DATA_BLOCK以后,定义了系统中的所有性能对象类型(PERF_OBJECT_TYPE),其中每一个对象类型头部中描述了下一个性能对象类型的偏移量Offset。工具

image001 图1image002 图2性能

性能对象有两种:一种是单实例对象,另外一种是多实例对象。图2和图3分别描述了这两种性能对象的数据组织方式。每一个对象数据块包含了一个PERF_OBJECT_TYPE结构,描述对象的性能数据。紧随其后是PERF_COUNTER_DEFINITION结构列表,描述了性能对象的所有计数器定义。对于单实例对象,计数器定义列表后是一个PERF_COUNTER_BLOCK结构,计数器数据紧随其后。每一个PERF_COUNTER_DEFINITION结构中定义了计数器数据相对于PERF_COUNTER_BLOCK的偏移量,所以能够很是方便地得到所有计数器的值。对支持多实例性能对象来讲,PERF_COUNTER_DEFINITION结构列表以后是一组实例信息数据块,每一个表示表明一个对象实例。每一个实例信息数据块由一个PERF_INSTANCE_DEFINITION结构体、实例名和一个PERF_COUNTER_BLOCK结构体组成。后面是计数器值数据,与单实例对象相同。操作系统

image003

图3日志

3、性能计数器的架构orm

性能计数器采用的是客户端服务器结构,性能数据采用共享内存存储,在应用中自定义性能计数器,在应用程序调用的时候调用性能计数器进行计数。体系结构以下:

image004

性能计数器能够得到应用程序性能的实时度量数据,而不须要经过记日志,进行另外的处理。并且性能计数器能够远程查看,能够经过管理工具(MOM)进行管理。在损耗上也很是的小。

4、.NET性能计数器实现

在.NET Framework下有个程序集

(C:WINDOWSMicrosoft.NETFrameworkv2.0.50727perfcounter.dll)实现了性能计数器功能,包括性能计数器的安装/卸载,值的读写。

在命名空间System.Diagnostic提供了一组性能计数器类,包括PerformanceCounterCategory,PerformanceCounter,PerformanceCounterInstaller,CouterSample等等。

在.NET中性能计数器有良好的抽象封装,实现起来比C/C++容易得多。咱们在应用常常只关注一些请求类型的数据度量,例以下述:

Requests Started

Requests Executing

Requests Completed

Requests Failed

Request Execution Time

Requests/Hour

Requests/5Min

Requests/Min

Requests/Sec

可是真正须要作这些性能计数器的安装/卸载,计数,读取仍是须要大量的代码,经过封装来简化编程接口。对于使用WCF来实现的服务,能够基于WCF的扩展性,进行进一步的封装。

相关文章
相关标签/搜索