パフォーマンス データの監視

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 を使用してアイドル プロセスのパフォーマンス データを取得します。 スクリプトには、Process オブジェクトのプロセッサ時間の割合カウンターの 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 パフォーマンス カウンター クラス。
  • refresher オブジェクト 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 修飾子テーブルの 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

WMI の使用