Memantau Data Performa

Dengan menggunakan WMI, Anda dapat mengakses data penghitung sistem secara terprogram dari objek di pustaka performa. Ini adalah data performa yang sama yang muncul di Monitor Sistem di utilitas Perfmon. Gunakan kelas penghitung kinerja yang telah diinstal sebelumnya untuk mendapatkan data performa dalam skrip atau aplikasi C++.

Bagian berikut dibahas dalam topik ini:

Kelas Performa WMI

Sebagai contoh, objek "NetworkInterface", di Monitor Sistem, diwakili dalam WMI oleh kelas Win32_PerfRawData_Tcpip_NetworkInterface untuk data mentah dan kelas Win32_PerfFormattedData_Tcpip_NetworkInterface untuk data yang telah dihitung sebelumnya, atau diformat. Kelas yang berasal dari Win32_PerfRawData dan dari Win32_PerfFormattedData harus digunakan dengan objek penyegaran. Pada kelas data mentah, aplikasi atau skrip C++ Anda harus melakukan perhitungan untuk mendapatkan output yang sama dengan Perfmon.exe. Kelas data yang diformat menyediakan data yang telah dihitung sebelumnya. Untuk informasi selengkapnya tentang mendapatkan data dalam aplikasi C++, lihat Mengakses Data Performa di C++. Untuk pembuatan skrip, lihat Mengakses Data Performa dalam Skrip dan Menyegarkan Data WMI dalam Skrip.

Contoh kode VBScript berikut menggunakan Win32_PerfFormattedData_PerfProc_Process untuk mendapatkan data performa untuk proses Menganggur. Skrip menampilkan data yang sama yang muncul di Perfmon untuk penghitung Waktu Prosesor % dari objek Proses. Panggilan ke SWbemObjectEx.Refresh_ melakukan operasi refresh. Ketahuilah bahwa data harus di-refresh, setidaknya sekali, untuk mendapatkan garis besar.

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

Kelas penghitung kinerja juga dapat menyediakan data statistik. Untuk informasi selengkapnya, lihat Mendapatkan Data Performa Statistik.

Penyedia Data Performa

WMI memiliki penyedia yang telah diinstal sebelumnya yang memantau performa sistem pada sistem lokal dan jarak jauh. Penyedia WmiPerfClass membuat kelas yang berasal dari Win32_PerfRawData dan dari Win32_PerfFormattedData. Penyedia WmiPerfInst memasok data secara dinamis ke kelas mentah dan berformat.

Menggunakan Kelas Data Performa Terformat

Contoh kode VBScript berikut mendapatkan data performa tentang memori, partisi disk, dan antrean kerja server. Skrip kemudian menentukan apakah nilai berada dalam rentang yang dapat diterima.

Skrip menggunakan objek penyedia WMI berikut dan objek pembuatan skrip:

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

Menggunakan Kelas Data Performa Mentah

Contoh kode VBScript berikut memperoleh waktu prosesor mentah persen saat ini di komputer lokal dan mengonversinya menjadi persentase. Contoh menunjukkan kepada Anda cara mendapatkan data performa mentah dari properti PercentProcessorTime dari kelas Win32_PerfRawData_PerfOS_Processor .

Untuk menghitung nilai waktu prosesor persen, Anda harus menemukan rumus. Cari nilai dalam pengkualifikasi CounterType untuk properti PercentProcessorTime di tabel CounterType Qualifier untuk mendapatkan nama konstanta. Temukan nama konstanta di Tipe Penghitung untuk mendapatkan rumus.

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

Menggunakan WMI