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
- Fournisseur de données de performance SDK
- Utilisation de classes de données de performances mises en forme
- Utilisation de classes de données de performances brutes
- Rubriques connexes
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 :
- Classes de compteurs de performances WMI préinstallées.
- Objet d’actualisation , SWbemRefresher.
- Éléments à ajouter au conteneur d’actualisation, 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
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
Rubriques connexes