监视性能数据

使用 WMI,可以通过编程方式从性能库中的对象访问系统计数器数据。 这与 Perfmon 实用工具的系统监视器中显示的性能数据相同。 使用预安装的性能计数器类获取脚本或 C++ 应用程序中的性能数据。

本主题包括以下部分:

WMI 性能类

例如,系统监视器中的“NetworkInterface”对象在 WMI 中由原始数据的 Win32_PerfRawData_Tcpip_NetworkInterface 类和预先计算数据或格式化数据的 Win32_PerfFormattedData_Tcpip_NetworkInterface 类表示。 从 Win32_PerfRawDataWin32_PerfFormattedData 派生的类必须与 refresher 对象一起使用。 在原始数据类上,C++ 应用程序或脚本必须执行计算以获得与 Perfmon.exe 相同的输出。 格式化数据类提供预先计算的数据。 若要详细了解如何在 C++ 应用程序中获取数据,请参阅在 C++ 中访问性能数据。 对于脚本,请参阅在脚本中访问性能数据在脚本中刷新 WMI 数据

以下 VBScript 代码示例使用 Win32_PerfFormattedData_PerfProc_Process 获取空闲进程的性能数据。 该脚本显示的数据与 Perfmon 中出现的 Process 对象的 % Processor Time 计数器的数据相同。 对 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_PerfRawDataWin32_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 限定符表中查找 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