監視效能數據

使用 WMI,您可以從效能連結庫中的物件以程式設計方式存取系統計數器數據。 這是出現在 Perfmon 公用程式中系統監視器中的相同效能數據。 使用預安裝 的性能計數器類別 ,在腳本或 C++ 應用程式中取得效能數據。

本主題將討論下列各節:

WMI 效能類別

例如,System Monitor 中的 「NetworkInterface」 物件是由原始數據的 Win32_PerfRawData_Tcpip_NetworkInterface 類別,以及預先計算或格式化數據的 Win32_PerfFormattedData_Tcpip_NetworkInterface 類別,以 WMI 表示。 衍生自 Win32_PerfRawData 和 Win32_PerfFormattedData的類別必須與重新整理器物件搭配使用。 在原始數據類別上,您的 C++ 應用程式或腳本必須執行計算,才能取得與 Perfmon.exe 相同的輸出。 格式化的數據類別提供預先計算的數據。 如需在 C++ 應用程式中取得資料的詳細資訊,請參閱 存取 C++ 中的效能數據。 如需腳本,請參閱 在腳本 中存取效能數據,以及在 腳本中重新整理 WMI 數據。

下列 VBScript 程式代碼範例會使用 Win32_PerfFormattedData_PerfProc_Process 來取得Idle進程的效能數據。 腳本會顯示在 Process 物件的 % Processor Time 計數器 Perfmon 中顯示的相同數據。 對 SWbemObjectEx.Refresh_的呼叫會執行重新整理作業。 請注意,必須至少重新整理一次數據,才能取得基準。

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
set PerfProcess = objWMIService.Get(_
    "Win32_PerfFormattedData_PerfProc_Process.Name='Idle'")

While (True)
    PerfProcess.Refresh_     
    Wscript.Echo PerfProcess.PercentProcessorTime
    Wscript.Sleep 1000
Wend

性能計數器類別也可以提供統計數據。 如需詳細資訊,請參閱 取得統計效能數據

效能數據提供者

WMI 已預安裝提供者,可監視本機系統和遠端的系統效能。 WmiPerfClass 提供者會建立衍生自 Win32_PerfRawData 和 Win32_PerfFormattedData 的類別。 WmiPerfInst 提供者會以動態方式將數據提供給原始和格式化的類別。

使用格式化的效能數據類別

下列 VBScript 程式代碼範例會取得記憶體、磁碟分區和伺服器工作佇列的相關效能數據。 然後,腳本會判斷值是否在可接受的範圍內。

此文稿會使用下列 WMI 提供者物件和文稿物件:

Set objCimv2 = GetObject("winmgmts:root\cimv2")
Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")

' Add items to the SWbemRefresher
' Without the SWbemRefreshableItem.ObjectSet call,
' the script will fail
Set objMemory = objRefresher.AddEnum _
    (objCimv2, _ 
    "Win32_PerfFormattedData_PerfOS_Memory").ObjectSet
Set objDiskQueue = objRefresher.AddEnum _
    (objCimv2, _
    "Win32_PerfFormattedData_PerfDisk_LogicalDisk").ObjectSet
Set objQueueLength = objRefresher.AddEnum _
    (objCimv2, _
    "Win32_PerfFormattedData_PerfNet_ServerWorkQueues").ObjectSet

' Initial refresh needed to get baseline values
objRefresher.Refresh
intTotalHealth = 0
' Do three refreshes to get data
For i = 1 to 3
    WScript.Echo "Refresh " & i
    For each intAvailableBytes in objMemory
        WScript.Echo "Available megabytes of memory: " _
            & intAvailableBytes.AvailableMBytes
        If intAvailableBytes.AvailableMBytes < 4 Then
            intTotalHealth = intTotalHealth + 1
        End If
    Next
    For each intDiskQueue in objDiskQueue
        WScript.Echo "Current disk queue length " & "Name: " _
            & intDiskQueue.Name & ":" _
            & intDiskQueue.CurrentDiskQueueLength
        If intDiskQueue.CurrentDiskQueueLength > 2 Then
            intTotalHealth = intTotalHealth + 1
        End If
    Next
    For each intServerQueueLength in objQueueLength
        WScript.Echo "Server work queue length: " _
            & intServerQueueLength.QueueLength
        If intServerQueueLength.QueueLength > 4 Then
            intTotalHealth = intTotalHealth + 1                       
        End If
    Wscript.Echo "  "
    Next
    If intTotalHealth > 0 Then
        Wscript.Echo "Unhealthy."
    Else
        Wscript.Echo "Healthy."
    End If
    intTotalHealth = 0
    Wscript.Sleep 5000
' Refresh data for all objects in the collection
    objRefresher.Refresh
Next

使用原始效能數據類別

下列 VBScript 程式代碼範例會取得本機計算機上的原始、目前百分比處理器時間,並將它轉換成百分比。 此範例示範如何從 Win32_PerfRawData_PerfOS_Processor 類別的 PercentProcessorTime 屬性取得原始效能數據。

若要計算處理器時間百分比值,您必須找出公式。 查閱 CounterType Qualifier 數據表中 PercentProcessorTime 屬性的 CounterType 限定符中的值,以取得常數名稱。 在計數器類型找出常數名稱,以取得公式。

Set objService = GetObject( _
    "Winmgmts:{impersonationlevel=impersonate}!\Root\Cimv2")

For i = 1 to 8
    Set objInstance1 = objService.Get( _
        "Win32_PerfRawData_PerfOS_Processor.Name='_Total'")
    N1 = objInstance1.PercentProcessorTime
    D1 = objInstance1.TimeStamp_Sys100NS

'Sleep for two seconds = 2000 ms
    WScript.Sleep(2000)

    Set perf_instance2 = objService.Get( _
        "Win32_PerfRawData_PerfOS_Processor.Name='_Total'")
    N2 = perf_instance2.PercentProcessorTime
    D2 = perf_instance2.TimeStamp_Sys100NS
' Look up the CounterType qualifier for the PercentProcessorTime 
' and obtain the formula to calculate the meaningful data. 
' CounterType - PERF_100NSEC_TIMER_INV
' Formula - (1- ((N2 - N1) / (D2 - D1))) x 100

    PercentProcessorTime = (1 - ((N2 - N1)/(D2-D1)))*100
    WScript.Echo "% Processor Time=" , Round(PercentProcessorTime,2)
Next

使用 WMI