效能監視計數器封裝元件PDHWrapper說明 (轉)

worldblog發表於2007-12-12
效能監視計數器封裝元件PDHWrapper說明 (轉)[@more@]

:namespace prefix = o ns = "urn:schemas--com::office" /> 

  監視計數器封裝PDHWrapper說明


 

版本

建立時間

建立人

備註

1.0.0112.2

2002-7-12

zhengyun_ustc

第一稿

引言:

編寫目的:

  本文件將說明效能監視封裝元件PDHWrapper的作用、介面定義,以及示例。

名詞和縮寫定義:

1.  PDH: Performance Data Helper

2. 


概述:

Microsoft WindwNT/2000 提供了一個強大的集來訪問事件和效能資料的眾多計數器。我們既可以實時地得到計數器的值,也可以從一個日誌中讀取計數器資料。

Microsoft提供的是Performance Monitoring Functions。一個最基本的使用PDH蒐集效能資料的步驟是:

u  建立一個查詢;

u  把感興趣的計數器新增到查詢中;

u  蒐集效能資料;

u  得到計數器的數值;

u  關閉查詢。

我把這些細節操作進行封裝,這就是PDHWrapper元件的IPDH介面。對於者來說,只需要呼叫一個屬性就可以完成一切,使用起來極其簡單。

呼叫示範:

longCounterValue = oPDH.counter("Process(_Total)Handle Count")



這個PDHWrapper元件需要Microsoft的PDH.DLL,這個元件一般說來在系統中是沒有的。只有了Microsoft PlatfoSDK,才會在WinntSystem32目錄找到它。

我的機器上的這個PDH.DLL的版本號是5.00.2195.2739,全稱是 Performance Data Helper DLL,是151KB。

經常會用到的計數器,分成下面幾類:

1:效能:

"Memory:Avaiable Bytes"計數器以便較精確地估計記憶體的使用情況。這個計數器表示當前的可用記憶體。

"Memory:Page Faults/sec"和"Memory:Page Reads/sec"計數器測量記憶體效能。當程式所引用的虛擬記憶體頁不在記憶體中時,將發生頁錯誤,"Memory:Page Faults/sec"表示頁錯誤的個數。如果某頁已在主記憶體中,或者它正被共享此頁的其他程式使用,那麼就不會從調入該頁。"Page Reads/sec"是讀取磁碟,以提取解決頁錯誤所需頁的次數。從總體上講,這兩個計數器反映了訪問磁碟的頻率,其值越低,說明響應時間越短。

  2:IIS

"Inte Information Server Global:Cache Hits%"計數器,它也被稱為“快取記憶體命中率”,是快取記憶體命中數和所有快取記憶體請求的比率。

"Internet Information Server Global:Cache flushes",它是快取資料的有效期,以秒為單位,超過這個時間,則快取資料過期。如果有效期太短,從快取中清除資料的頻率太高,則不能滿足實際要求;如果有效期太長,無用資料不能及時從記憶體中清除,則會產生記憶體的浪費。

  3:效能:

"NConnection:Bytes Total/sec"是指本地傳送和接收資料的速度。為了檢視網路連線是否成為瓶頸,將這個計數器的資料速度與總頻寬進行比較。

“ Service:Maximum Connections(最大連線數)”、“Web Service:Total Connection Attempts(連線嘗試總數)”和“Web Service:Connection Refused(被拒絕的連線數)”,來決定Web服務是否使用了足夠多的連線。

4:效能:

System:% Total Processor Time :是計算機上所有處理器進行有用工作所花費時間的比例。

Processor:% Processor Time :是處理器用於處理有效工作的時間比。

Process:% Processor Time :是某程式的所有執行緒使用處理器來執行命令所花費時間的百分比。

NBT Connection:Bytes Total/sec:是本地計算機傳送和接收資料的速度。

System:Processor Queue Length :是處理器佇列的瞬間長度,以執行緒為單位。

Processor:Interrupts/sec :是處理器所遇到的裝置中斷次數。

Processor:%DPC Time:是處理器花費在延遲的過程呼叫(Deferred Procedure Call)上的時間百分比。

執行環境規定:

Microsoft Server。


IPDH Reference:

 IPDH Interface Reference:

Remarks:

counter property

這個屬性使用起來很簡單。就像ADO的Recordset一樣,支援這樣的語法:recordset(“SomeFieldName”),得到的就是這個資料集的欄位的值。我們這裡也是,不用關心是否建立了查詢,是否新增了計數器,只要傳遞的計數器的名字是正確的,就可以得到實時的數值。

explain property

使用辦法同上。只要傳遞計數器的名字,返回值就是計數器的解釋性文字。不過這不一定能得到。

count property

這是當前查詢中的計數器的總數目。

Requirements:

Supported platforms include Microsoft Windows® 2000.

Implementation: PDHWrapper.dll, PDHWrapper.lib.

輸入項[C/C++]

Header and IDL files: PDHWrapper.h, PDHWrapper.idl

Version-InDependent ProgID: PDHWrapper.PDH

Version-InDependent CLSID: { 76CB53AF-BD5E-4BC0-892E-E5AAFA4E2046 }


IPDH Members

Properties:

Property Name

  Property Description

counter

輸入的引數是計數器的名字;

首先察看是否已經訂閱了這個計數器,如果沒有,就新增它;

然後蒐集效能資料;

最後把這個計數器的數值返回

count

訂閱的計數器的數目

explain

計數器的說明文字

counter property (PDH/IPDH)

我們內建了一個std::map,它來計數器的名字和控制程式碼。當呼叫counter屬性查詢計數器時,我們首先查詢map中是否有這號人物。如果沒有的話,就呼叫PdhAddCounter方法告訴本次查詢我們要訂閱這個計數器了。

接著,呼叫PdhCollectQueryData方法計數器中的資料。

之後,我們呼叫PdhGetFormattedCounterValue來得到這個計數器數值的LONG型別值。

至於,開啟和關閉本次Query, 都是放在構造和解構函式中做的,不用使用者勞神了。

Usage:

[Script]

Script Syntax

longCounterValue = oPDH.counter(strCounterName)



Parameters

strCounterName

Pointer to the fully-qualified and resolved path of the counter to create. This path can contain wildcard characters.

Example


Dim oPDH


Set oPDH = Server.Create("PDHWrapper.PDH")



Dim strCounterName


Dim longCounterValue


StrCounterName = “Process(_Total)Handle Count” ‘ 控制程式碼數目


longCounterValue = oPDH.counter(strCounterName)  ‘ 計數器的數值


set oPDH = nothing


%>

[]

Visual Basic Syntax

bResult = oSMReceive.ReceiveXML(strMSgContent)



Parameters

strCounterName

Pointer to the fully-qualified and resolved path of the counter to create. This path can contain wildcard characters.

Example

Dim oPDH As New PDHWrapper.PDH


longCounterValue = oPDH.counter(“Process(_Total)Handle Count”)

[C/C++]

C/C++ Syntax

HRESULT CPDH::get_counter(VARIANT* Key, VARIANT* pRetItem);



Parameters

Key[in]:

  計數器的名字

pRetItem[out,retval]:

  計數器的數值

C/C++ Return Values

S_OK

 


Remarks:

如果輸入引數不正確,則返回的VARIANT變數為VT_EMPTY。

由於計數器太多的話,對系統效能有很大的影響,所以我們設定了一個限制。最多隻能新增50個計數器,如果超過的話,返回的VARIANT變數也為VT_EMPTY。

count property (PDH/IPDH)

這裡返回的是我們內建的std::map物件的size()。

Usage:

[Script]

Script Syntax

nCounterNumber = oPDH.count()



Example


Dim oPDH


Set oPDH = Server.CreateObject("PDHWrapper.PDH")



Dim nCounterNumber


nCounterNumber = oPDH.count  ‘ 計數器的總數目



set oPDH = nothing


%>

[Visual Basic]

Visual Basic Syntax

nCounterNumber = oPDH.count()


Example

Dim oPDH As New PDHWrapper.PDH


nCounterNumber = oPDH.count

[C/C++]

C/C++ Syntax

HRESULT CPDH::get_count(long* pCount);



Parameters

pCount[out,retval]:

  計數器的總數目

C/C++ Return Values

S_OK

 


explain property (PDH/IPDH)

使用者可以自由察看任何一個計數器的說明。如果我們在std::map物件中沒有找到本計數器,就新增一個,但是獲得計數器的說明之後 ,就把這個計數器刪除。如果在此之前已經訂閱了本計數器,則不刪除它。

Usage:

[Script]

Script Syntax

szExplainText = oPDH.explain(strCounterName)



Parameters

strCounterName

Pointer to the fully-qualified and resolved path of the counter to create. This path can contain wildcard characters.

Example


Dim oPDH


Set oPDH = Server.CreateObject("PDHWrapper.PDH")



Dim strCounterName


Dim strExplainText


StrCounterName = “Process(_Total)Handle Count” ‘ 控制程式碼數目


strExplainText = oPDH.explain(strCounterName)  ‘ 計數器的解釋


set oPDH = nothing


%>

[Visual Basic]

Visual Basic Syntax

szExplainText = oPDH.explain(strCounterName)



Parameters

strCounterName

Pointer to the fully-qualified and resolved path of the counter to create. This path can contain wildcard characters.

Example

Dim oPDH As New PDHWrapper.PDH


strExplainText = oPDH.explain(“zhengyunProcess(_Total)Handle Count”)

[C/C++]

C/C++ Syntax

HRESULT CPDH::get_explain(VARIANT* Key, VARIANT* pRetItem);



Parameters

Key[in]:

  計數器的名字

pRetItem[out,retval]:

  計數器的說明

C/C++ Return Values

S_OK

 


Remarks:

如果輸入引數不正確,則返回的VARIANT變數為VT_EMPTY。

如果引數是一個代表計數器名字的BSTR,則

第一步,呼叫PdhAddCounter來新增計數器;

第二步,PdhGetCounterInfo得到這個計數器的PDH_COUNTER_INFO結構;

第三步,得到計數器的PDH_COUNTER_INFO結構的szExplainText。

必要時,呼叫PdhRemoveCounter方法將這個計數器從查詢中刪除。


Using IPDH Interface:

下面的例子將給出查詢效能指標的全部流程。

Example:

Dim obj

Set obj = Server.CreateObject("PDHWrapper.PDH")

Repsonse.Write obj.counter("Process(_Total)Handle Count")

Repsonse.Write obj.counter("Process(_Total)Handle Count")

Repsonse.Write obj.counter("server.tomosoft.comProcess(_Total)Handle Count")

Repsonse.Write obj.counter("zhengyunProcess(_Total)Thread Count")

Repsonse.Write obj.explain("Process(_Total)Handle Count")

Repsonse.Write obj.count

%>


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991684/,如需轉載,請註明出處,否則將追究法律責任。

相關文章