Analyse des données de performances

À l’aide de WMI, vous pouvez accéder par programmation aux données du compteur système à partir d’objets dans les bibliothèques de performances. Il s’agit des mêmes données de performances qui apparaissent dans le Moniteur système de l’utilitaire Perfmon. Utilisez les classes de compteur de performances préinstallées pour obtenir des données de performances dans des scripts ou des applications C++.

Les sections suivantes seront abordées dans cette rubrique :

Compteur de performance WMI

Par exemple, l’objet « NetworkInterface », dans le Moniteur système, est représenté dans WMI par la classe Win32_PerfRawData_Tcpip_NetworkInterface pour les données brutes et la classe Win32_PerfFormattedData_Tcpip_NetworkInterface pour les données précalculées ou mises en forme. Les classes dérivées de Win32_PerfRawData et de Win32_PerfFormattedData doivent être utilisées avec un objet d’actualisation . Sur les classes de données brutes, votre application ou script C++ doit effectuer des calculs pour obtenir la même sortie que Perfmon.exe. Les classes de données mises en forme fournissent des données précalculées. Pour plus d’informations sur l’obtention de données dans les applications C++, consultez Accès aux données de performances en C++. Pour les scripts, consultez Accès aux données de performances dans script et Actualisation des données WMI dans les scripts.

L’exemple de code VBScript suivant utilise Win32_PerfFormattedData_PerfProc_Process pour obtenir des données de performances pour le processus inactif. Le script affiche les mêmes données que celles qui apparaissent dans Perfmon pour le compteur % de temps processeur de l’objet Process. L’appel à SWbemObjectEx.Refresh_ effectue l’opération d’actualisation. N’oubliez pas que les données doivent être actualisées au moins une fois pour obtenir une ligne 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

Les classes de compteurs de performances peuvent également fournir des données statistiques. Pour plus d’informations, consultez Obtention de données statistiques de performances.

Fournisseurs de données de performances

WMI a des fournisseurs préinstallés qui surveillent les performances du système à la fois sur le système local et à distance. Le fournisseur WmiPerfClass crée les classes dérivées de Win32_PerfRawData et de Win32_PerfFormattedData. Le fournisseur WmiPerfInst fournit des données dynamiquement aux classes brutes et mises en forme.

Utilisation de classes de données de performances mises en forme

L’exemple de code VBScript suivant obtient des données de performances sur la mémoire, les partitions de disque et les files d’attente de travail du serveur. Le script détermine ensuite si les valeurs se trouvent dans une plage acceptable.

Le script utilise les objets de fournisseur WMI et les objets de script suivants :

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

Utilisation de classes de données de performances brutes

L’exemple de code VBScript suivant obtient le pourcentage de temps processeur brut actuel sur l’ordinateur local et le convertit en pourcentage. L’exemple montre comment obtenir des données de performances brutes à partir de la propriété PercentProcessorTime de la classe Win32_PerfRawData_PerfOS_Processor.

Pour calculer la valeur du pourcentage de temps processeur, vous devez localiser la formule. Recherchez la valeur dans le qualificateur CounterType pour la propriété PercentProcessorTime dans la table Qualificateur CounterType pour obtenir le nom de la constante. Recherchez le nom de la constante dans Types de compteurs pour obtenir la formule.

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

Utilisation de WMI