利用Windows性能計數(shù)器(PerformanceCounter)監(jiān)控
一、概述
性能監(jiān)視,是Windows NT提供的一種系統(tǒng)功能。Windows NT一直以來總是集成了性能監(jiān)視工具,它提供有關(guān)操作系統(tǒng)當(dāng)前運(yùn)行狀況的信息,針對各種對象提供了數(shù)百個性能計數(shù)器。性能對象,就是被監(jiān)視的對象,典型例子有Processor、Process、Memory、TCP/UDP/IP/ICMP、PhysicalDisk等。計數(shù)器通常提供操作系統(tǒng)、應(yīng)用程序、服務(wù)、驅(qū)動程序等的性能相關(guān)信息,以此來分析系統(tǒng)瓶頸和對系統(tǒng)及應(yīng)用程序性能進(jìn)行診斷和調(diào)優(yōu)。性能計數(shù)器機(jī)制讓應(yīng)用程序和操作系統(tǒng)組件可以向性能監(jiān)視應(yīng)用程序,比如性能監(jiān)視器(Performance Monitor),報告一些與性能有關(guān)的統(tǒng)計信息。PerfMon.exe中可以查看性能對象、性能計數(shù)器和對象實例,可通過添加計數(shù)器來查看相關(guān)描述信息。
實際上,可以通過編寫程序來訪問所有的Windows性能計數(shù)器。Windows中,注冊表是訪問性能計數(shù)器的一種機(jī)制。性能信息并不實際存在于注冊表中,在注冊表編輯器RegEdit.exe中是無法查看的,但可以通過注冊表函數(shù)來訪問,利用注冊表鍵來獲得從性能數(shù)據(jù)提供者那里提供的數(shù)據(jù)。打開名為HKEY_PERFORMANCE_DATA的特殊鍵,利用RegQueryValueEx函數(shù)查詢鍵下面的值,就可以直接訪問注冊表性能計數(shù)器信息。當(dāng)然,也可以利用性能數(shù)據(jù)幫助器(PDH, Performance Data Helper) API (Pdh.dll)來訪問性能計數(shù)器信息。
性能日志和警報是作為 Windows 操作系統(tǒng)的一部分發(fā)行的一種管理性能監(jiān)控工具。它依靠由各種 Windows 組件、子系統(tǒng)和應(yīng)用程序發(fā)布的性能計數(shù)器,使您可以跟蹤資源使用情況以及針對時間以圖形方式繪制它們。您可以使用 Performance Logs and Alerts 來監(jiān)控標(biāo)準(zhǔn)的性能計數(shù)器(例如,內(nèi)存使用情況或處理器使用情況),或者您可以定義您自己的自定義計數(shù)器來監(jiān)控應(yīng)用程序特定的活動。
二、HKEY_PERFORMANCE_DATA數(shù)據(jù)組織
性能數(shù)據(jù)的頭部是一個PERF_DATA_BLOCK結(jié)構(gòu)(如圖1所示),它描述系統(tǒng)和性能數(shù)據(jù)總體信息,可從Global鍵值處查詢得到該結(jié)構(gòu)數(shù)據(jù)。PERF_DATA_BLOCK之后,定義了系統(tǒng)中的全部性能對象類型(PERF_OBJECT_TYPE),其中每個對象類型頭部中描述了下一個性能對象類型的偏移量Offset。
性能對象有兩種:一種是單實例對象,另一種是多實例對象。圖2和圖3分別描述了這兩種性能對象的數(shù)據(jù)組織方式。每個對象數(shù)據(jù)塊包含了一個PERF_OBJECT_TYPE結(jié)構(gòu),描述對象的性能數(shù)據(jù)。緊隨其后是PERF_COUNTER_DEFINITION結(jié)構(gòu)列表,描述了性能對象的全部計數(shù)器定義。對于單實例對象,計數(shù)器定義列表后是一個PERF_COUNTER_BLOCK結(jié)構(gòu),計數(shù)器數(shù)據(jù)緊隨其后。每個PERF_COUNTER_DEFINITION結(jié)構(gòu)中定義了計數(shù)器數(shù)據(jù)相對于PERF_COUNTER_BLOCK的偏移量,因此可以非常方便地獲得全部計數(shù)器的值。對支持多實例性能對象來說,PERF_COUNTER_DEFINITION結(jié)構(gòu)列表之后是一組實例信息數(shù)據(jù)塊,每個表示代表一個對象實例。每個實例信息數(shù)據(jù)塊由一個PERF_INSTANCE_DEFINITION結(jié)構(gòu)體、實例名和一個PERF_COUNTER_BLOCK結(jié)構(gòu)體組成。后面是計數(shù)器值數(shù)據(jù),與單實例對象相同。
圖3
三、性能計數(shù)器的架構(gòu)
性能計數(shù)器采用的是客戶端服務(wù)器結(jié)構(gòu),性能數(shù)據(jù)采用共享內(nèi)存存儲,在應(yīng)用中自定義性能計數(shù)器,在應(yīng)用程序調(diào)用的時候調(diào)用性能計數(shù)器進(jìn)行計數(shù)。體系結(jié)構(gòu)如下:
性能計數(shù)器可以獲得應(yīng)用程序性能的實時度量數(shù)據(jù),而不需要通過記日志,進(jìn)行另外的處理。而且性能計數(shù)器可以遠(yuǎn)程查看,可以通過管理工具(MOM)進(jìn)行管理。在損耗上也非常的小。
四、.NET性能計數(shù)器實現(xiàn)
在.NET Framework下有個程序集
(C:WINDOWSMicrosoft.NETFrameworkv2.0.50727perfcounter.dll)實現(xiàn)了性能計數(shù)器功能,包括性能計數(shù)器的安裝/卸載,值的讀寫。
在命名空間System.Diagnostic提供了一組性能計數(shù)器類,包括PerformanceCounterCategory,PerformanceCounter,PerformanceCounterInstaller,CouterSample等等。
在.NET中性能計數(shù)器有良好的抽象封裝,實現(xiàn)起來比C/C++容易得多。我們在應(yīng)用經(jīng)常只關(guān)注一些請求類型的數(shù)據(jù)度量,例如下述:
Requests Started
Requests Executing
Requests Completed
Requests Failed
Request Execution Time
Requests/Hour
Requests/5Min
Requests/Min
Requests/Sec
但是真正需要做這些性能計數(shù)器的安裝/卸載,計數(shù),讀取還是需要大量的代碼,通過封裝來簡化編程接口。對于使用WCF來實現(xiàn)的服務(wù),可以基于WCF的擴(kuò)展性,進(jìn)行進(jìn)一步的封裝。
.Net最佳實踐3:使用性能計數(shù)器收集性能數(shù)據(jù)
http://blogs.msdn.com/b/ralarcon/archive/2012/10/03/web-app-performance-counters-compilation.aspx
歡迎大家掃描下面二維碼成為我的客戶,扶你上云





浙公網(wǎng)安備 33010602011771號