Supervisión de datos de rendimiento

Mediante WMI, es posible acceder a los datos del contador del sistema mediante programación desde objetos de las bibliotecas de rendimiento. Son los mismos datos de rendimiento que aparecen en Monitor de sistema en la utilidad Perfmon. Use las clases de contador de rendimiento preinstaladas para obtener datos de rendimiento en scripts o aplicaciones de C++.

En este tema se describen las secciones siguientes:

Clases de rendimiento de WMI

Por ejemplo, el objeto "NetworkInterface", en Monitor de sistema, se representa en WMI mediante la clase Win32_PerfRawData_Tcpip_NetworkInterface para los datos sin procesar y la clase Win32_PerfFormattedData_Tcpip_NetworkInterface para los datos precalculados o con formato. Las clases derivadas de Win32_PerfRawData y de Win32_PerfFormattedData deben usarse con un objeto refresher. En las clases de datos sin procesar, el script o la aplicación de C++ deben realizar cálculos para obtener el mismo resultado que Perfmon.exe. Las clases de datos con formato proporcionan datos precalculados. Para obtener más información sobre cómo obtener datos en aplicaciones de C++, consulte Acceso a datos de rendimiento en C++. Para el scripting, consulte Acceso a datos de rendimiento en scripts y Actualización de datos de WMI en scripts.

En el siguiente ejemplo de código de VBScript se usa Win32_PerfFormattedData_PerfProc_Process para obtener datos de rendimiento para el proceso inactivo. El script muestra los mismos datos que aparecen en Perfmon para el contador % de tiempo de procesador del objeto Process. La llamada a SWbemObjectEx.Refresh_ realiza la operación de actualización. Tenga en cuenta que los datos deben actualizarse, al menos una vez, para obtener una línea de base.

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

Las clases de contador de rendimiento también pueden proporcionar datos estadísticos. Para obtener más información, consulte Obtención de datos estadísticos de rendimiento.

Proveedores de datos de rendimiento

WMI tiene proveedores preinstalados que supervisan el rendimiento del sistema en el sistema local y de forma remota. El proveedor WmiPerfClass crea las clases derivadas de Win32_PerfRawData y de Win32_PerfFormattedData. El proveedor WmiPerfInst proporciona datos dinámicamente a clases con y sin formato.

Uso de clases de datos de rendimiento con formato

En el siguiente ejemplo de código VBScript se obtienen datos de rendimiento sobre la memoria, las particiones de disco y las colas de trabajo del servidor. A continuación, el script determina si los valores están dentro de un intervalo aceptable.

El script usa los siguientes objetos de proveedor de WMI y objetos de scripting:

  • Clases de contador de rendimiento de WMI preinstaladas.
  • Objeto refresher, SWbemRefresher.
  • Elementos que se van a agregar al contenedor del actualizador, SWbemRefreshableItem
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

Uso de clases de datos de rendimiento sin procesar

En el ejemplo de código VBScript siguiente se obtiene el porcentaje actual de tiempo de procesador sin procesar en el equipo local y se convierte en un porcentaje. En el ejemplo se muestra cómo obtener datos de rendimiento sin procesar de la propiedad PercentProcessorTime de la clase Win32_PerfRawData_PerfOS_Processor.

Para calcular el valor del porcentaje de tiempo de procesador, debe ubicar la fórmula. Busque el valor en el calificador CounterType para la propiedad PercentProcessorTime en la tabla CounterType Qualifier para obtener el nombre de la constante. Busque el nombre de la constante en Tipos de contador para obtener la fórmula.

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

Uso de WMI