利用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的擴展性,進行進一步的封裝。

相關文章
相關標籤/搜索