パフォーマンス データの監視
WMI を使用すると、パフォーマンス ライブラリ内のオブジェクトからプログラムでシステム カウンター データにアクセスできます。 これは、Perfmon ユーティリティのシステム モニターに表示されるのと同じパフォーマンス データです。 スクリプトまたは C++ アプリケーションでパフォーマンス データを取得するには、プレインストールされているパフォーマンス カウンター クラスを使用します。
このトピックでは次のセクションを扱います。
WMI パフォーマンス クラス
たとえば、System Monitor の "NetworkInterface" オブジェクトは、WMI では、生データの場合は Win32_PerfRawData_Tcpip_NetworkInterface クラスによって、事前計算されたデータまたは書式設定されたデータの場合は Win32_PerfFormattedData_Tcpip_NetworkInterface クラスによって表されます。 Win32_PerfRawData から派生したクラスと Win32_PerfFormattedData から派生したクラスは、リフレッシャー オブジェクトと共に使用しなければなりません。 生データ クラスでは、C++ アプリケーションまたはスクリプトが計算を実行して、Perfmon.exe と同じ出力を取得する必要があります。 書式設定されたデータ クラスは、事前に計算されたデータを提供します。 C++ アプリケーションでのデータの取得の詳細については、「C++ でのパフォーマンス データへのアクセス」を参照してください。 スクリプトの作成については、「スクリプトでのパフォーマンス データへのアクセス」と「スクリプトでの WMI データのリフレッシュ」を参照してください。
次の VBScript コード例では、Win32_PerfFormattedData_PerfProc_Process を使用して Idle プロセスのパフォーマンス データを取得します。 スクリプトには、Process オブジェクトの % Processor Time カウンターについて、Perfmon に表示されるものと同じデータが表示されます。 SWbemObjectEx.Refresh_ の呼び出しによってリフレッシュ操作が実行されます。 ベースラインを取得するには、少なくとも 1 回データをリフレッシュする必要があることに注意してください。
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 修飾子の値を検索して、定数名を取得します。 Counter Types で定数名を見つけて、数式を取得します。
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
関連トピック