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

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

Como usar o WMI