Monitorar dados de desempenho
Usando o WMI, você pode acessar os dados do contador do sistema programaticamente a partir de objetos nas bibliotecas de desempenho. Esses são os mesmos dados de desempenho que aparecem no Monitor do Sistema no utilitário Perfmon. Use as classes do contador de desempenho pré-instaladas para obter os dados de desempenho em scripts ou aplicativos C++.
As seguintes seções serão abordadas neste tópico:
- Classes de Desempenho do WMI
- Provedores de Dados de Desempenho
- Usar classes de dados formatados de desempenho
- Usar classes de dados brutos de desempenho
- Tópicos relacionados
Classes de Desempenho do WMI
Por exemplo, o objeto "NetworkInterface", no Monitor do Sistema, é representado no WMI pela classe Win32_PerfRawData_Tcpip_NetworkInterface para dados brutos e a classe Win32_PerfFormattedData_Tcpip_NetworkInterface para dados pré-calculados ou formatados. Classes derivadas de Win32_PerfRawData e de Win32_PerfFormattedData devem ser usadas com um objeto atualizador. Em classes de dados brutos, seu aplicativo ou script C++ deve executar cálculos para obter a mesma saída que Perfmon.exe. Classes de dados formatados fornecem dados pré-calculados. Para obter mais informações sobre como obter dados em aplicativos C++, consulte Acessar dados de desempenho em C++. Para scripts, consulte Acessar dados de desempenho em script e Atualizar dados do WMI em scripts.
O exemplo de código VBScript a seguir usa Win32_PerfFormattedData_PerfProc_Process para obter dados de desempenho para o processo ocioso. O script exibe os mesmos dados que aparecem no Perfmon para o contador % de Tempo do Processador do objeto Process. A chamada para SWbemObjectEx.Refresh_ executa a operação de atualização. Esteja ciente de que os dados devem ser atualizados, pelo menos uma vez, para obter uma linha 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
As classes do contador de desempenho também podem fornecer dados estatísticos. Para obter mais informações, consulte Obter dados estatísticos de desempenho.
Provedores de dados de desempenho
O WMI tem provedores pré-instalados que monitoram o desempenho do sistema local e remotamente. O provedor WmiPerfClass cria as classes derivadas de Win32_PerfRawData e de Win32_PerfFormattedData. O provedor WmiPerfInst fornece dados dinamicamente para classes tanto em formato bruto quanto formatado.
Usando classes de dados formatados de desempenho
O exemplo de código VBScript a seguir obtém dados de desempenho da memória, de partições de disco e de filas de trabalho do servidor. Em seguida, o script determina se os valores estão dentro de um intervalo aceitável.
O script usa os seguintes objetos do provedor WMI e objetos de script:
- Classes do contador de desempenho do WMI pré-instaladas.
- O objeto atualizador, SWbemRefresher.
- Itens a serem adicionados ao contêiner de atualização, 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
Usando classes de dados brutos de desempenho
O exemplo de código VBScript a seguir obtém o tempo de processador atual em percentual bruto no computador local e converte-o para porcentagem. O exemplo mostra como obter dados brutos de desempenho da propriedade PercentProcessorTime da classe Win32_PerfRawData_PerfOS_Processor.
Para calcular o valor percentual de tempo do processador, você deve localizar a fórmula. Pesquise o valor no qualificador CounterType para a propriedade PercentProcessorTime na tabela CounterType Qualifier para obter o nome da constante. Localize o nome da constante em Counter Types para obter a 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
Tópicos relacionados