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
- Proveedores de datos de rendimiento
- Uso de clases de datos de rendimiento con formato
- Uso de clases de datos de rendimiento sin procesar
- Temas relacionados
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
Temas relacionados