新萄京娱乐场.2959.com 14

【新萄京娱乐场.2959.com】利用Windows性能计数器,Windows系统资源监控

  • 1、windows自带系统资源监控工具
  • 2、Windows监控的数据来源:Performance
    Counters

    • 2.1 Performance
      Counter架构
    • 2.2 Performance
      Counter数据结构
    • 2.3 消费Performance
      Counter数据
  • 3、使用基于PDH的python客户端

一、概述

 

性能监视,是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)来访问性能计数器信息。

1、Windows自带系统资源监控工具

我们都知道,Windows自带有系统资源监视器。主要有3个地方:

1)
Windows的任务管理器的性能页签,包括了CPU,内存,磁盘,网络等系统资源的监控。它主要监控系统资源的总体使用情况,使用它,我们可以发现是否有资源达到瓶颈了等等。

 新萄京娱乐场.2959.com 1

 

2) Windows资源监视器

这个工具可以看出系统资源到底是由哪些进程消耗的。通过它,可以快速查看到到底哪些进程占用了你的系统资源。

 新萄京娱乐场.2959.com 2

3) 性能监视器

前两种工具已经提供你要监控的大部分功能,在某些情况下,可能仍然不能定位问题,这时候就需要你更进一步的了解系统的运行状况。那么这个工具就是一个不错的选择。

 新萄京娱乐场.2959.com 3

 

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

2、Windows 监控的数据来源:Performance Counters

      
Windows的这些监控工具之所以能够展示这些资源的情况,它们的数据来源都是一个叫Performance
Counter的东东。

 

二、HKEY_PERFORMANCE_DATA数据组织

2.1 PerformanceCounter 架构

PerformanceCounter架构如下:

 新萄京娱乐场.2959.com 4

 

 

采用了Producer / Consumer 架构,支持多种客户端从Registry消费数据。

上图中,A 使用Registry接口来消费数据,而B 和 Performance
Monitor两个客户端则使用了pdh.dll来消费数据。

 

 

 

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

2.2 Performance Counter 数据结构

如果你想用程序来消费Counter的数据,不论使用哪种API来消费数据,不论使用哪种工具来消费数据,都需要了解Performance
Counter的领域语言,也就是说要了解它内部的数据是如何组织的。

 

它的基本概念如下:

Machine:机器,这个没什么好说的,支持消费本机的监控数据,也可以消费其他其他的监控数据。

perfObject:可以理解为监控哪种资源,譬如说处理器,磁盘

instance:监控的资源可能有多个实例,多个网卡,多个CPU,多块磁盘等

counter:计数器,每一个instance都会有多个计数器,例如cpu的idle,user,interrupt都是一个counter

 

更直观的理解这些概念: 

 新萄京娱乐场.2959.com 5

 

 

新萄京娱乐场.2959.com 6
图1新萄京娱乐场.2959.com 7
图2

2.3 消费Performance Counter数据

       从上面的架构图来看可以使用registry API或者 PDH.dll
,或者wmi等3种方式来消费数据。这两种API是C或者C++开发的。

 

1)Registry API :

 

2)WMI:

 

3)PDH API:

目前已知了两个版本:

C++:

 

Python :

Pywin32中有一个win32pdh的模块,就是python版本的pdh。

 

 

其他工具:

4)windows自带的typeperf命令

5)nsclient++

 

性能对象有两种:一种是单实例对象,另一种是多实例对象。图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结构体组成。后面是计数器值数据,与单实例对象相同。

3、使用基于PDH的python客户端

 

Win32pdh API说明:

使用win32pdh API的一个简易教程:

 

基于win32pdh 封装的一套API:

 新萄京娱乐场.2959.com 8

 

 

 

最右侧是win32pdh模块,从python的仓库里下载即可。

Windows_collector是我封装的核心代码,用于通过简单的代码,即可监控到系统资源。

最左边的则是来使用这套API的。使用这套API的好处是,不必去再花时间学习win32pdh这套API就可以轻松的获取你要的监控数据。

 

这套API的源码:

 新萄京娱乐场.2959.com 9

新萄京娱乐场.2959.com 10

新萄京娱乐场.2959.com 11

新萄京娱乐场.2959.com 12

 代码的命名规范不是 python的,想必看起来,也不会有太多的困难。

使用这套API,只需要简单的代码即可对系统资源进行监控,例如:

ObjectCollector("Memory").collect()

 

新萄京娱乐场.2959.com 13

图3

三、性能计数器的架构

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

新萄京娱乐场.2959.com 14

性能计数器可以获得应用程序性能的实时度量数据,而不需要通过记日志,进行另外的处理。而且性能计数器可以远程查看,可以通过管理工具(MOM)进行管理。在损耗上也非常的小。

四、.NET性能计数器实现

在.NET Framework下有个程序集

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注