Мониторинг данных о производительности
С помощью WMI можно получить доступ к данным счетчика системы программным способом из объектов в библиотеках производительности. Это те же данные производительности, которые отображаются в системном мониторе в служебной программе Perfmon. Используйте предварительно установленные классы счетчиков производительности для получения данных о производительности в скриптах или приложениях C++.
В этом разделе рассматриваются следующие разделы:
- Классы производительности WMI
- Поставщики данных производительности
- Использование форматированных классов данных производительности
- Использование необработанных классов данных производительности
- Связанные статьи
Классы производительности WMI
Например, объект NetworkInterface в System Monitor представлен в WMI классом Win32_PerfRawData_Tcpip_NetworkInterface для необработанных данных и классом Win32_PerfFormattedData_Tcpip_NetworkInterface для предварительно вычисляемых или отформатированных данных. Классы, производные от Win32_PerfRawData и от Win32_PerfFormattedData, должны использоваться с объектом обновления. В необработанных классах данных приложение или скрипт C++ должно выполнять вычисления, чтобы получить те же выходные данные, что и Perfmon.exe. Форматированные классы данных предоставляют предварительно вычисляемые данные. Дополнительные сведения о получении данных в приложениях C++ см. в статье "Доступ к данным о производительности" в C++. Сведения о скриптах см. в разделе "Доступ к данным о производительности" в скрипте и обновлении данных WMI в скриптах.
В следующем примере кода VBScript используется Win32_PerfFormattedData_PerfProc_Process для получения данных о производительности для процесса простоя. В скрипте отображаются те же данные, которые отображаются в Perfmon для счетчика времени процессора объекта Process. Вызов 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 и объекты скриптов:
- Предварительно установленные классы счетчиков производительности WMI.
- Объект обновления SWbemRefresher.
- Элементы для добавления в контейнер обновления 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
Использование необработанных классов данных производительности
Следующий пример кода VBScript получает необработанное, текущее процентное время процессора на локальном компьютере и преобразует его в процент. В примере показано, как получить необработанные данные о производительности из свойства PercentProcessorTime класса Win32_PerfRawData_PerfOS_Processor.
Чтобы вычислить значение времени процессора процента, необходимо найти формулу. Найдите значение в квалификаторе 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
См. также