監視效能數據
使用 WMI,您可以從效能連結庫中的物件以程式設計方式存取系統計數器數據。 這是出現在 Perfmon 公用程式中系統監視器中的相同效能數據。 使用預安裝 的性能計數器類別 ,在腳本或 C++ 應用程式中取得效能數據。
本主題將討論下列各節:
WMI 效能類別
例如,System Monitor 中的 「NetworkInterface」 物件是由原始數據的 Win32_PerfRawData_Tcpip_NetworkInterface 類別,以及預先計算或格式化數據的 Win32_PerfFormattedData_Tcpip_NetworkInterface 類別,以 WMI 表示。 衍生自 Win32_PerfRawData 和 Win32_PerfFormattedData的類別必須與重新整理器物件搭配使用。 在原始數據類別上,您的 C++ 應用程式或腳本必須執行計算,才能取得與 Perfmon.exe 相同的輸出。 格式化的數據類別提供預先計算的數據。 如需在 C++ 應用程式中取得資料的詳細資訊,請參閱 存取 C++ 中的效能數據。 如需腳本,請參閱 在腳本 中存取效能數據,以及在 腳本中重新整理 WMI 數據。
下列 VBScript 程式代碼範例會使用 Win32_PerfFormattedData_PerfProc_Process 來取得Idle進程的效能數據。 腳本會顯示在 Process 物件的 % Processor Time 計數器 Perfmon 中顯示的相同數據。 對 SWbemObjectEx.Refresh_的呼叫會執行重新整理作業。 請注意,必須至少重新整理一次數據,才能取得基準。
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
性能計數器類別也可以提供統計數據。 如需詳細資訊,請參閱 取得統計效能數據。
效能數據提供者
WMI 已預安裝提供者,可監視本機系統和遠端的系統效能。 WmiPerfClass 提供者會建立衍生自 Win32_PerfRawData 和 Win32_PerfFormattedData 的類別。 WmiPerfInst 提供者會以動態方式將數據提供給原始和格式化的類別。
使用格式化的效能數據類別
下列 VBScript 程式代碼範例會取得記憶體、磁碟分區和伺服器工作佇列的相關效能數據。 然後,腳本會判斷值是否在可接受的範圍內。
此文稿會使用下列 WMI 提供者物件和文稿物件:
- 預安裝 WMI 性能計數器類別。
- 重新整理器物件 SWbemRefresher。
- 要新增至重新整理器容器 的專案 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
使用原始效能數據類別
下列 VBScript 程式代碼範例會取得本機計算機上的原始、目前百分比處理器時間,並將它轉換成百分比。 此範例示範如何從 Win32_PerfRawData_PerfOS_Processor 類別的 PercentProcessorTime 屬性取得原始效能數據。
若要計算處理器時間百分比值,您必須找出公式。 查閱 CounterType Qualifier 數據表中 PercentProcessorTime 屬性的 CounterType 限定符中的值,以取得常數名稱。 在計數器類型中找出常數名稱,以取得公式。
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
相關主題