Obtenção de dados de desempenho estatístico

No WMI, você pode definir dados de desempenho estatístico com base em dados em classes de desempenho formatadas derivadas de Win32_PerfFormattedData. As estatísticas disponíveis são média, mínimo, máximo, intervalo e variância, conforme definido em Tipos de Contador Estatístico.

A lista a seguir inclui os tipos especiais de contadores estatísticos:

Os exemplos a seguir mostram como:

  • Crie um arquivo MOF que defina uma classe de dados calculados.
  • Escreva um script que crie uma instância da classe e atualize periodicamente os dados na instância com os valores estatísticos recalculados.

Arquivo MOF

O exemplo de código MOF a seguir cria uma nova classe de dados calculados chamada Win32_PerfFormattedData_AvailableMBytes. Essa classe contém dados da propriedade AvailableMBytes da classe bruta Win32_PerfRawData_PerfOS_Memory. A classe Win32_PerfFormattedData_AvailableBytes define as propriedades Average, Min, Max, e Variance.

O arquivo MOF usa os Qualificadores de propriedade para classes de contadores de desempenho formatados para definir a fonte de dados de propriedade e a fórmula de cálculo.

  • A propriedade Average obtém dados brutos da propriedade Win32_PerfRawData_PerfOS_Memory.AvailableMBytes.
  • O qualificadorCounterpara a propriedade Average especifica a fonte de dados brutos.
  • O qualificador CookingType especifica a fórmula COOKER_MIN para calcular os dados.
  • O qualificador SampleWindow especifica quantas amostras devem ser coletadas antes de executar o cálculo.
// Store the new Win32_PerfFormattedData_MemoryStatistics
//     class in the Root\Cimv2 namespace
#pragma autorecover
#pragma namespace("\\\\.\\Root\\CimV2")

qualifier vendor:ToInstance;
qualifier guid:ToInstance;
qualifier displayname:ToInstance;
qualifier perfindex:ToInstance;
qualifier helpindex:ToInstance;
qualifier perfdetail:ToInstance;
qualifier countertype:ToInstance;
qualifier perfdefault:ToInstance;
qualifier defaultscale:ToInstance;

qualifier dynamic:ToInstance;
qualifier hiperf:ToInstance;
qualifier AutoCook:ToInstance;
qualifier AutoCook_RawClass:ToInstance;
qualifier CookingType:ToInstance;
qualifier Counter:ToInstance;


// Define the Win32_PerFormattedData_MemoryStatistics
//     class, derived from Win32_PerfFormattedData
[
  dynamic,
  // Name of formatted data provider: "WMIPerfInst" for Vista 
  //   and later
  provider("HiPerfCooker_v1"), 
  // Text that will identify new counter in Perfmon
  displayname("My Calculated Counter"),                            
  // A high performance class     
  Hiperf,
  // Contains calculated data 
  Cooked, 
  // Value must be 1 
  AutoCook(1), 
  // Raw performance class to get data for calculations
  AutoCook_RawClass("Win32_PerfRawData_PerfOS_Memory"),
  // Value must be 1        
  AutoCook_RawDefault(1),
  // Name of raw class property to use for timestamp in formulas 
  PerfSysTimeStamp("Timestamp_PerfTime"), 
  // Name of raw class property to use for frequency in formulas
  PerfSysTimeFreq("Frequency_PerfTime"), 
  // Name of raw class property to use for timestamp in formulas
  Perf100NSTimeStamp("Timestamp_Sys100NS"),
  // Name of raw class property to use for frequency in formulas
  Perf100NSTimeFreq("Frequency_Sys100NS"),
  // Name of raw class property to use for timestamp in formulas
  PerfObjTimeStamp("Timestamp_Object"),
  // Name of raw class property to use for frequency in formulas 
  PerfObjTimeFreq("Frequency_Object"),
  // Only one instance of class allowed in namespace
  singleton                                                   
]

class Win32_PerfFormattedData_MemoryStatistics
          : Win32_PerfFormattedData
{

// Define the properties for the class. 
// All the properties perform different
//     statistical operations on the same
//     property, AvailableMBytes, in the raw class

// Define the Average property,
//     which uses the "COOKER_AVERAGE" counter type and 
//     gets its data from the AvailableMBytes 
//     property in the raw class

    [
     CookingType("COOKER_AVERAGE"),
     Counter("AvailableMBytes"),
     SampleWindow(10)
    ]
    uint64 Average = 0;

// Define the Min property, which uses
//     the "COOKER_MIN" counter type and 
//     gets its data from the AvailableMBytes
//     property in the raw class

    [
     CookingType("COOKER_MIN"),
     Counter("AvailableMBytes"),
     SampleWindow(10)
    ]
    uint64 Min = 0;

// Define the Max property, which uses
//     the "COOKER_MAX" counter type and 
//     gets its data from the
//     AvailableMBytes property in the raw class

    [
     CookingType("COOKER_MAX"),
     Counter("AvailableMBytes"),
     SampleWindow(10)
    ]
    uint64 Max = 0;

// Define the Range property, which uses
//     the "COOKER_RANGE" counter type and 
//     gets its data from the AvailableMBytes
//     property in the raw class

    [
     CookingType("COOKER_RANGE"),
     Counter("AvailableMBytes"),
     SampleWindow(10)
    ]
    uint64 Range = 0;

// Define the Variance property, which uses
//     the "COOKER_VARIANCE" counter type and 
//     gets its data from the AvailableMBytes
//     property in the raw class

    [
     CookingType("COOKER_VARIANCE"),
     Counter("AvailableMBytes"),
     SampleWindow(10)
    ]
    uint64 Variance = 0;
};

Script

O exemplo de código de script a seguir obtém estatísticas sobre a memória disponível, em megabytes, usando o MOF criado anteriormente. O script usa o objeto de script SWbemRefresher para criar um atualizador que contém uma instância da classe de estatísticas que o arquivo MOF cria, que é Win32_PerfFormattedData_MemoryStatistics. Para obter mais informações sobre como usar scripts, consulte Atualizando dados WMI em scripts. Se estiver trabalhando em C++, consulte Acessando dados de desempenho em C++.

Observação

SWbemRefreshableItem.Object deve ser chamado depois de obter o item da chamada para SWbemRefresher.Add ou o script falhará. SWbemRefresher.Refresh deve ser chamado antes de entrar no loop para obter valores de linha de base, ou as propriedades estatísticas são zero (0) na primeira passagem.

 

' Connect to the Root\Cimv2 namespace
strComputer = "."
Set objService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")

' Create a refresher
Set Refresher = CreateObject("WbemScripting.SWbemRefresher")
If Err <> 0 Then
WScript.Echo Err
WScript.Quit
End If

' Add the single instance of the statistics
'    class to the refresher
Set obMemoryStatistics = Refresher.Add(objService, _
    "Win32_PerfFormattedData_MemoryStatistics=@").Object

' Refresh once to obtain base values for cooking calculations
Refresher.Refresh

Const REFRESH_INTERVAL = 10

' Refresh every REFRESH_INTERVAL seconds 
For I=1 to 3
  WScript.Sleep REFRESH_INTERVAL * 1000
  Refresher.Refresh

  WScript.Echo "System memory statistics" _
      & "(Available Megabytes) " _
      & "for the past 100 seconds - pass " & i 
  WScript.Echo "Average = " _
     & obMemoryStatistics.Average & VBNewLine & "Max = " _
     & obMemoryStatistics.Max & VBNewLine & "Min = " _
     & obMemoryStatistics.Min & VBNewLine & "Range = " _ 
     & obMemoryStatistics.Range & VBNewLine & "Variance = " _
     & obMemoryStatistics.Variance 
Next

Executar o script

O procedimento a seguir descreve como executar o exemplo.

Para executar o script de exemplo:

  1. Copie o código MOF e o script para arquivos em seu computador.
  2. Dê ao arquivo MOF uma extensão .mof e ao arquivo de script uma descrição .vbs.
  3. Na linha de comando, mude para o diretório em que os arquivos estão armazenados e execute Mofcomp no arquivo MOF. Por exemplo, se você nomear o arquivo CalculatedData.mof, o comando será Mofcomp CalculatedData.mof
  4. Execute o script.

Monitorar dados de desempenho

Acessando classes de desempenho pré-instaladas do WMI

Qualificadores de propriedade para classes de contador de desempenho formatadas

Tipos de contadores estatísticos