パフォーマンス データの収集
クエリを作成し、それに カウンターを追加した後、PdhCollectQueryData 関数を呼び出して、クエリ内のすべてのカウンターの現在の生データを取得します。
レート カウンターなどの多くのカウンターでは、書式設定されたデータ値を計算するために 2 つのデータ サンプルが必要です。 PDH は、現在のサンプルと以前に収集されたサンプルのデータを保持します。 次の手順では、表示可能な値を計算するために 2 つのサンプルを必要とするカウンター値を収集する方法について説明します。
表示可能な値を計算するために 2 つのサンプルを必要とするカウンター値を収集するには
- PdhCollectQueryData を呼び出して、最初のサンプルを収集します。
- Sleep 関数を呼び出して、コレクション間で少なくとも 1 秒待機します。
- PdhCollectQueryData をもう一度呼び出して、2 番目のサンプルを収集します。
- PdhGetFormattedCounterValue 関数を呼び出して、表示可能な値を計算します。
- 手順 2 から 4 を繰り返します。
待機期間を自分で実装する代わりに、PdhCollectQueryDataEx 関数を呼び出すことができます。この関数は、指定された時間待機し、サンプルを収集し、アプリケーション定義イベントをトリガーするタイミング スレッドを作成します。
ログ ファイルからパフォーマンス データのクエリを実行する場合は、時間範囲を定義することもできます。 時間範囲では、クエリを時間範囲内で収集されたサンプルに制限します (各サンプルには、収集された日時のタイム スタンプが含まれます)。 時間範囲を設定および取得する方法の詳細については、「クエリの時間範囲の設定」を参照してください。
パフォーマンス データを収集してログ ファイルに書き込む場合は、PdhCollectQueryData を呼び出す代わりに PdhUpdateLog 関数を呼び出します。 詳細については、「ログ ファイルの操作と ログ ファイル へのパフォーマンス データの書き込み」を参照してください。
表示可能なサンプル値の計算の詳細については、「パフォーマンス データの表示」を参照してください。
一部のパフォーマンス カウンターは、単一プロセッサ システム用に設計されており、マルチプロセッサ コンピューターでは正確ではない可能性があります。 たとえば、プロセスは単一のプロセッサの 100% に制限されます。ただし、スレッドは複数のプロセッサを使用でき、合計で 100% を超えます。
"\Processor(_Total)\% Processor Time" カウンター値は、すべてのプロセッサの平均使用量です。 たとえば、プロセッサが 2 つあり、1 つは 100% で、もう 1 つは 0% の場合、このカウンターは 50% を報告します。 そのため、範囲は 0 から 100 です。
"\Process(X)\% Processor Time" (X はプロセス名)、カウンター値はプロセス X のすべてのスレッドによるプロセッサ使用率の合計です。たとえば、2 つのプロセッサを搭載したコンピューターでは、プロセスに 2 つのスレッドがあり、1 つは CPU の 75% を占め、もう 1 つは別の CPU の 80% を占める場合、このカウンターは 155% を報告します。 このカウンターの範囲は 0 から 100 * ProcessorCount です。
Process
カウンターセットを使用する場合は、CPU 使用率の予想される値の範囲外の値を受け取ることができます。 CPU 使用率を計算するには、PDH には 2 つのサンプル (それぞれ生の値とタイムスタンプ) が必要です。 PDH はインスタンス名のみを使用してプロセスに一致するため、異なるプロセスのサンプルを混在させる場合があります。 たとえば、同じインスタンス名の 3 つのプロセスがサンプリングされ、3 番目のサンプルの後にいずれかのプロセスが終了した場合、別のプロセスがその終了したプロセスによって空になったスロットに移動します。 その結果、4 番目のサンプルを書式設定すると、終了したプロセスの 3 番目のサンプルと、終了したプロセスのスロットに移動したプロセスの 4 番目のサンプルが使用されるため、書式設定されたカウンターは正しくない値を提供します。
次の表は、データの収集中にプロセスが終了した場合に発生する方法を示しています。 この表は、プロセス X の 3 つのインスタンスに対する 5 つのカウンター値サンプルを示しています。サンプルは 1 秒間隔で収集されます。 3 番目のサンプルが収集されると、スロット 1 のプロセス X が終了します。 スロット 1 のプロセス X が終了すると、スロット 2 のプロセス X はスロット 1 に移動します。 スロット 2 でプロセス X の 4 番目のサンプルを収集すると、最初の値は 1,000 ではなく 20 になり、2 番目の値は 1,500 になります。 カウンター値を書式設定すると、予想される 500 ミリ秒ではなく 1,480 ミリ秒が得られます。 5 番目のサンプル値を書式設定すると、期待される値が得られます。
サンプル | プロセス X のスロット 0 | プロセス X のスロット 1 | プロセス X のスロット 2 |
---|---|---|---|
サンプル 1 | 0 | 0 | 0 |
サンプル 2 | 20 | 10 | 500 |
サンプル 3 | 40 | 20 | 1,000 |
サンプル 4 | 60 | 1,500 (前者のスロット 2 から) | 該当なし。 スロット 1 で収集されました。 |
サンプル 5 | 80 | 2,000 | 該当なし。 スロット 1 で収集されました。 |
ヒント
Windows 11 以降では、新しい Process V2
カウンターセットを使用してこの問題を回避できます。 Process V2
カウンターセットには、インスタンス名にプロセス ID が含まれます。 これにより、元の Process
カウンターセットに表示される一貫性のない結果が回避されます。