Monitoraggio dei dati sulle prestazioni

Usando WMI, è possibile accedere ai dati dei contatori di sistema a livello di codice dagli oggetti nelle librerie delle prestazioni. Si tratta degli stessi dati sulle prestazioni visualizzati nell'utilità Monitoraggio sistema nell'utilità Perfmon. Usare le classi di contatore delle prestazioni preinstallate per ottenere dati sulle prestazioni in script o applicazioni C++.

Le sezioni seguenti sono illustrate in questo argomento:

Classi di prestazioni WMI

Ad esempio, l'oggetto "NetworkInterface", in Monitoraggio sistema, è rappresentato in WMI dalla classe Win32_PerfRawData_Tcpip_NetworkInterface per i dati non elaborati e la classe Win32_PerfFormattedData_Tcpip_NetworkInterface per i dati precalcolati o formattati. Le classi derivate da Win32_PerfRawData e da Win32_PerfFormattedData devono essere usate con un oggetto refresher . Nelle classi di dati non elaborate, l'applicazione o lo script C++ devono eseguire calcoli per ottenere lo stesso output di Perfmon.exe. Le classi di dati formattate forniscono dati precalcolati. Per altre informazioni sull'acquisizione di dati nelle applicazioni C++, vedere Accesso ai dati sulle prestazioni in C++. Per lo script, vedere Accesso ai dati sulle prestazioni nello script e aggiornamento dei dati WMI negli script.

L'esempio di codice VBScript seguente usa Win32_PerfFormattedData_PerfProc_Process per ottenere dati sulle prestazioni per il processo inattiva. Lo script visualizza gli stessi dati visualizzati in Perfmon per il contatore % Processor Time dell'oggetto Process. La chiamata a SWbemObjectEx.Refresh_ esegue l'operazione di aggiornamento. Tenere presente che i dati devono essere aggiornati, contemporaneamente, per ottenere una baseline.

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

Le classi di contatore delle prestazioni possono anche fornire dati statistici. Per altre informazioni, vedere Ottenere dati statistici sulle prestazioni.

Provider di dati sulle prestazioni

WMI dispone di provider preinstallati che monitorano le prestazioni del sistema sia nel sistema locale che in remoto. Il provider WmiPerfClass crea le classi derivate da Win32_PerfRawData e da Win32_PerfFormattedData. Il provider WmiPerfInst fornisce dati in modo dinamico a classi non elaborate e formattate.

Uso delle classi di dati delle prestazioni formattate

L'esempio di codice VBScript seguente ottiene i dati sulle prestazioni relativi alla memoria, alle partizioni del disco e alle code di lavoro del server. Lo script determina quindi se i valori si trovano all'interno di un intervallo accettabile.

Lo script usa gli oggetti provider WMI e gli oggetti di scripting seguenti:

  • Classi di contatori delle prestazioni WMI preinstallate.
  • Oggetto refresher, SWbemRefresher.
  • Elementi da aggiungere al contenitore di aggiornamento, 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 di classi di dati sulle prestazioni non elaborate

Nell'esempio di codice VBScript seguente viene ottenuto un tempo di processore non elaborato e corrente nel computer locale e lo converte in una percentuale. L'esempio illustra come ottenere dati sulle prestazioni non elaborati dalla proprietà PercentProcessorTime della classe Win32_PerfRawData_PerfOS_Processor .

Per calcolare il valore del tempo del processore percentuale, è necessario individuare la formula. Cercare il valore nel qualificatore CounterType per la proprietà PercentProcessorTime nella tabella CounterType Qualifier per ottenere il nome costante. Individuare il nome costante in Tipi di contatore per ottenere la formula.

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

Uso di WMI