Monitoraggio dei dati sulle prestazioni

Con 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 in Monitoraggio di sistema nell'utilità Perfmon. Usare le classi di contatori delle prestazioni preinstallate per ottenere dati sulle prestazioni in script o applicazioni C++.

Le sezioni seguenti sono descritte in questo argomento:

Classi di prestazioni WMI

Ad esempio, l'oggetto "NetworkInterface", in Monitoraggio di 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 su come ottenere dati nelle applicazioni C++, vedere Accesso ai dati sulle prestazioni in C++. Per la creazione di script, vedere Accesso ai dati sulle prestazioni nello script e aggiornamento dei dati WMI negli script.

Nell'esempio di codice VBScript seguente viene usato Win32_PerfFormattedData_PerfProc_Process per ottenere i dati sulle prestazioni per il processo inattiva. Lo script visualizza gli stessi dati visualizzati in Perfmon per il contatore % tempo processore dell'oggetto Process. La chiamata a SWbemObjectEx.Refresh_ esegue l'operazione di aggiornamento. Tenere presente che i dati devono essere aggiornati, almeno una volta, per ottenere una linea di 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

Le classi dei contatori delle prestazioni possono anche fornire dati statistici. Per altre informazioni, vedere Recupero di dati statistici sulle prestazioni.

Provider di dati delle prestazioni

WMI include 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 i dati in modo dinamico alle classi non elaborate e formattate.

Uso delle classi di dati delle prestazioni formattate

Nell'esempio di codice VBScript seguente vengono ottenuti dati sulle prestazioni relativi a memoria, partizioni disco e 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:

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 il tempo del processore raw, current percent nel computer locale e lo converte in percentuale. Nell'esempio viene illustrato come ottenere dati sulle prestazioni non elaborati dalla proprietà PercentProcessorTime della classe Win32_PerfRawData_PerfOS_Processor .

Per calcolare il valore del tempo processore percentuale, è necessario individuare la formula. Cercare il valore nel qualificatore CounterType per la proprietà PercentProcessorTime nella tabella CounterType Qualifier per ottenere il nome della costante. Individuare il nome della 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