Überwachen von Leistungsdaten

Mithilfe von WMI können Sie programmgesteuert über Objekte in den Leistungsbibliotheken auf Systemzählerdaten zugreifen. Dies sind die gleichen Leistungsdaten, die im Hilfsprogramm Perfmon im Systemmonitor angezeigt werden. Verwenden Sie die vorinstallierten Leistungsindikatorklassen, um in Skripts oder C++-Anwendungen Leistungsdaten abzurufen.

In diesem Themenbereich werden die folgenden Abschnitte behandelt:

WMI-Leistungsklassen

Beispielsweise wird das NetworkInterface-Objekt im Systemmonitor in WMI durch die Win32_PerfRawData_Tcpip_NetworkInterface-Klasse für Rohdaten und die Win32_PerfFormattedData_Tcpip_NetworkInterface-Klasse für vorberechnete oder formatierte Daten dargestellt. Von Win32_PerfRawData und von Win32_PerfFormattedData abgeleitete Klassen müssen mit einem refresher-Objekt verwendet werden. Bei Rohdatenklassen muss Ihre C++-Anwendung oder Ihr C++-Skript Berechnungen ausführen, um die gleiche Ausgabe wie „Perfmon.exe“ zu erhalten. Formatierte Datenklassen stellen vorberechnete Daten bereit. Weitere Informationen zum Abrufen von Daten in C++-Anwendungen finden Sie unter Zugreifen auf Leistungsdaten in C++. Informationen zur Skripterstellung finden Sie unter Zugreifen auf Leistungsdaten in Skripts und Aktualisieren von WMI-Daten in Skripts.

Im folgenden VBScript-Codebeispiel wird Win32_PerfFormattedData_PerfProc_Process verwendet, um Leistungsdaten für den Leerlaufprozess abzurufen. Das Skript zeigt die gleichen Daten an, die in Perfmon für den Zähler „% Prozessorzeit“ des Process-Objekts angezeigt werden. Durch Aufrufen von SWbemObjectEx.Refresh_ erfolgt der Aktualisierungsvorgang. Beachten Sie, dass die Daten mindestens einmal aktualisiert werden müssen, um eine Baseline zu erhalten.

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

Leistungsindikatorklassen können auch statistische Daten bereitstellen. Weitere Informationen finden Sie unter Abrufen statistischer Leistungsdaten.

Leistungsdatenanbieter

WMI verfügt über vorinstallierte Anbieter, die die Systemleistung auf lokalen und Remotesystemen überwachen. Der WmiPerfClass-Anbieter erstellt die von Win32_PerfRawData und Win32_PerfFormattedData abgeleiteten Klassen. Der WmiPerfInst-Anbieter stellt Daten dynamisch sowohl für nicht formierte als auch für formatierte Klassen bereit.

Verwenden formatierter Leistungsdatenklassen

Im folgenden VBScript-Codebeispiel werden Leistungsdaten zu Arbeitsspeicher, Datenträgerpartitionen und Serverwarteschlangen abgerufen. Das Skript bestimmt dann, ob die Werte in einem akzeptablen Bereich liegen.

Das Skript verwendet die folgenden WMI-Anbieter- und -Skripterstellungsobjekte:

  • Vorinstallierte WMI-Leistungsindikatorklassen.
  • Das Aktualisierungsobjekt, SWbemRefresher.
  • Elemente, die dem Aktualisierungscontainer, SWbemRefreshableItem, hinzugefügt werden sollen
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

Verwenden unformatierter Leistungsdatenklassen

Im folgenden VBScript-Codebeispiel wird die nicht formatierte, aktuelle Prozessorzeit in Prozent auf dem lokalen Computer abgerufen und in einen Prozentsatz konvertiert. Das Beispiel zeigt, wie Sie nicht formatierte Leistungsdaten aus der PercentProcessorTime-Eigenschaft der Win32_PerfRawData_PerfOS_Processor-Klasse abrufen.

Um den Wert für die Prozessorzeit in Prozent zu berechnen, müssen Sie die Formel bestimmen. Schlagen Sie den Wert im CounterType-Qualifizierer für die PercentProcessorTime-Eigenschaft in der CounterType Qualifier-Tabelle nach, um den Namen der Konstante zu erhalten. Bestimmen Sie den Konstantennamen in Leistungsindikatortypen, um die Formel zu erhalten.

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

Verwenden von WMI