利用Windows性能計數器(PerformanceCounter)監控

一、概述

        性能監視,是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 來監控標準的性能計數器(例如,內存使用情況或處理器使用情況),或者您可以定義您自己的自定義計數器來監控應用程序特定的活動。

 

二、HKEY_PERFORMANCE_DATA數據組織

        性能數據的頭部是一個PERF_DATA_BLOCK結構(如圖1所示),它描述系統和性能數據總體信息,可從Global鍵值處查詢得到該結構數據。PERF_DATA_BLOCK之後,定義了系統中的全部性能對象類型(PERF_OBJECT_TYPE),其中每個對象類型頭部中描述了下一個性能對象類型的偏移量Offset。

p_w_picpath001 圖1p_w_picpath002 圖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結構體組成。後面是計數器值數據,與單實例對象相同。

p_w_picpath003

圖3

三、性能計數器的架構

        性能計數器採用的是客戶端服務器結構,性能數據採用共享內存存儲,在應用中自定義性能計數器,在應用程序調用的時候調用性能計數器進行計數。體系結構如下:

p_w_picpath004

性能計數器可以獲得應用程序性能的實時度量數據,而不需要通過記日誌,進行另外的處理。而且性能計數器可以遠程查看,可以通過管理工具(MOM)進行管理。在損耗上也非常的小。

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

 

.Net最佳實踐3:使用性能計數器收集性能數據

http://blogs.msdn.com/b/ralarcon/archive/2012/10/03/web-app-performance-counters-compilation.aspx

Monitor your SQL Server

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章