パフォーマンス カウンターについて

Windows パフォーマンス カウンターは、プロセッサ、メモリ、ディスクの使用量の統計情報といったさまざまな種類のシステム データを収集するための一貫性のあるインターフェイスを備えた、高レベルの抽象化レイヤーを提供します。 システム管理者はパフォーマンス カウンターを使用して、パフォーマンスまたは動作に問題がないか監視します。 ソフトウェア開発者はパフォーマンス カウンターを使用して、コンポーネントのリソース使用状況を調べます。

重要

Windows パフォーマンス カウンターは、管理/診断データの検出と収集向けに最適化されています。 1 秒間に複数回収集されるように設計されていないため、高頻度のデータ収集やアプリケーション プロファイリングには適していません。 システム情報へのアクセスのオーバーヘッドが少ない場合は、より直接的な API (Process Status HelperGlobalMemoryStatusExGetSystemTimesGetProcessTimes など) の使用が適している可能性があります。 プロファイリングの場合、-critsec-dpcisr-eflag、または -ProfileSource のオプションを指定した tracelog.exe を使用してシステム プロファイリング データが含まれる ETW ログを収集するか、ハードウェア カウンター プロファイリングを使用できます。

Note

Windows パフォーマンス カウンターと QueryPerformanceCounter API を混同しないようにしてください。 Windows パフォーマンス カウンターは、さまざまな種類のシステム情報に対する高レベルの抽象化を提供します。 QueryPerformanceCounter 関数は、高精度タイムスタンプへの最適化されたアクセスを提供します。

作業の開始

概念

Windows パフォーマンス カウンター システムは、コンシューマープロバイダーカウンターセットカウンターインスタンスカウンター値で構成されています。

コンシューマーは、パフォーマンス データを利用するソフトウェア コンポーネントです。 Windows には、パフォーマンス データを利用する組み込みツールがいくつか含まれています。 たとえば、タスク マネージャー、リソース モニター、パフォーマンス モニター、typeperf.exe、logman.exe、relog.exe などがあります。 開発者は、パフォーマンス カウンター API を使用して、パフォーマンス カウンターにアクセスするスクリプトとアプリケーションを記述できます。

プロバイダーは、パフォーマンス データを生成して発行するソフトウェア コンポーネントです。 プロバイダーは、1 つ以上の "カウンターセット" のデータを発行します。 たとえば、データベース システムがそれ自体をパフォーマンス データ プロバイダーとして登録する場合があります。

  • V1 プロバイダーは、コンシューマーのプロセスで実行されるパフォーマンス DLL を介してパフォーマンス データを発行するソフトウェア コンポーネントです。 V1 プロバイダーは、.ini ファイルを介してシステムにインストールされます。 V1 プロバイダー アーキテクチャは非推奨です。 新しいプロバイダーでは、V2 プロバイダー アーキテクチャを使用する必要があります。
  • V2 プロバイダーは、パフォーマンス カウンター プロバイダー API を介してパフォーマンス データを発行するソフトウェア コンポーネントです。 V2 プロバイダーは、.man (XML マニフェスト) ファイルを介してシステムにインストールされます。

カウンターセットは、プロバイダー内のパフォーマンス データをグループ化したものです。 カウンターセットには、名前と 1 つ以上の "カウンター" があります。 カウンターセットからデータを収集すると、多数の "インスタンス" が返されます。 一部の Windows API では、カウンターセットはパフォーマンス オブジェクトと呼ばれます。 たとえば、データベース システムのパフォーマンス データ プロバイダーは、データベースごとの統計情報のカウンターセットを提供する場合があります。

カウンターは、1 つのパフォーマンス データの定義です。 カウンターには名前と型があります。 たとえば、"データベースごとの統計情報" カウンターセットには、名前が "1 秒あたりのトランザクション数" で型が PERF_COUNTER_COUNTER のカウンターが含まれている場合があります。

インスタンスは、パフォーマンス データが報告されるエンティティです。 インスタンスには、名前 (文字列) と 1 つ以上の "カウンター値" があります。 たとえば、"データベースごとの統計情報" カウンターセットには、データベースごとに 1 つのインスタンスが含まれている場合があります。 インスタンス名はデータベース名であり、各インスタンスには"1 秒あたりのトランザクション数"、"メモリ使用量"、"ディスク使用量" の各カウンターのカウンター値が含まれます。

カウンター値は、1 つのパフォーマンス カウンター データの値です。 カウンター値は、対応するカウンターの型に応じて 32 ビットまたは 64 ビットの符号なし整数です。 "インスタンス" についての説明では、"カウンター値" は "カウンター" または "値" と呼ばれることがあります。

ヒント

パフォーマンス カウンターの用語を馴染みのあるスプレッドシートの用語に当てはめて考えると、わかりやすくなります。 カウンターセットはテーブルのようなものです。 カウンターは列のようなものです。 インスタンスは行のようなものです。 カウンター値は、テーブル内のセルのようなものです。

単一インスタンス カウンターセットには、常に 1 つのインスタンスのデータが含まれます。 これは、システム グローバル統計情報を報告するカウンターセットによく使用されます。 たとえば、Windows には、グローバル メモリ使用量を報告する "Memory" という組み込みの単一インスタンス カウンターセットがあります。

複数インスタンス カウンターセットには、可変数のインスタンスのデータが含まれています。 これは、システム内のエンティティについて報告するカウンターセットによく使用されます。 たとえば、Windows には、インストールされている CPU ごとに 1 つのインスタンスを報告する "Processor Information" という組み込みの複数インスタンス カウンターセットがあります。

コンシューマーは、プロバイダーのカウンターセットからデータを定期的に収集して記録します。 たとえば、コンシューマーは、1 秒に 1 回または 1 分に 1 回データを収集します。 収集されたデータは、サンプルと呼ばれます。 サンプルは、タイムスタンプと、カウンターセットのインスタンスのデータで構成されます。 各インスタンスのデータには、インスタンス名 (文字列) とカウンター値のセット (整数、カウンターセット内のカウンターごとに 1 つの値) が含まれます。

インスタンス名は通常、1 つのサンプル内で一意である必要があります。つまり、プロバイダーは、1 つのサンプルの一部として同じ名前のインスタンスを 2 つ返すことはできません。 一部の古いプロバイダーはこの規則に従っていないため、コンシューマーは一意でないインスタンス名を許容できる必要があります。 インスタンス名では大文字と小文字が区別されないため、複数のインスタンスに大文字と小文字のみが異なる名前を指定することはできません。

Note

下位互換性のために、"Process" カウンターセットは EXE ファイル名に基づいて一意でないインスタンス名を返します。 これにより、特に一意でない名前を持つプロセスが起動またはシャットダウンした場合に、結果がわかりにくくなる可能性があります。一般的に、サンプル間でインスタンス名が正しく一致しないことが原因で、データの不具合が発生するからです。 "Process" カウンターセットのコンシューマーは、これらの一意でないインスタンス名と、それによって発生するデータの不具合を許容できる必要があります。 Windows 11 以降では、Process V2 カウンターセットを使用してこの問題を回避できます。

インスタンス名はサンプル間で不変である必要があります。つまり、プロバイダーは、カウンターセットが収集されるたびに同じエンティティに同じインスタンス名を使用する必要があります。

各カウンターには型があります。 カウンター型は、カウンターの生の値 の型 (符号なし 32 ビット整数または符号なし 64 ビット整数) を示します。 カウンター型は、カウンターの生の値が表す内容も示します。これにより、有用な統計情報を生成するために生の値を処理する方法が決まります。

一部のカウンター型は単純で、直接役に立つ生の値を持ちますが、多くのカウンター型では追加の処理を行って有用な書式設定された値を生成する必要があります。 書式設定された値を生成するために 2 つのサンプルの生の値を必要とするカウンター型もあれば、タイムスタンプを必要とするもの、複数のカウンターの生の値を必要するものもあります。 次に例を示します。

  • PERF_COUNTER_LARGE_RAWCOUNT は 64 ビットの生の値で、有用な値にするための処理は必要ありません。 "使用中のメモリのバイト数" などの特定の時点の値に適しています。
  • PERF_COUNTER_RAWCOUNT_HEX は 32 ビットの生の値で、有用な値にするために単純な 16 進数の書式設定のみを行う必要があります。 特定の時点の情報や、"フラグ" や "ベース アドレス" などの識別情報に適しています。
  • PERF_COUNTER_BULK_COUNT はイベントの数を示す 64 ビットの生の値で、イベントが発生するレートを計算するために使用されます。 このカウンター型で有用な値を生成するには、時間で区切られた 2 つのサンプルが必要です。 書式設定された値はイベント レート (2 つのサンプル間の間隔で 1 秒あたりにイベントが発生した回数) になります。 2 つのサンプルが s0s1 だと仮定すると、書式設定された値 (イベント レート) は (s1.EventCount - s0.EventCount)/(s1.TimestampInSeconds - s0.TimestampInSeconds) として計算されます。

プロバイダーは、ステートレスであるかのように動作することが求められます。つまり、カウンターセットからのデータ収集がプロバイダーの状態に明らかな影響を及ぼしてはいけません。 たとえば、プロバイダーは、カウンターセットの収集時にカウンター値を 0 にリセットすることはできません。また、現在のコレクションの値を調整するために前のコレクションのタイムスタンプを使用することもできません。 代わりに、コンシューマーが生の値とそのタイムスタンプに基づいて有用な統計情報を計算できるように、正確な型を持つ単純な生カウンター値を提供する必要があります。

パフォーマンス API アーキテクチャ

Performance counter applications invoke Windows APIs which call into providers to obtain performance data.

パフォーマンス カウンターのコンシューマーには次のものが含まれます。

ほとんどのパフォーマンス カウンター コンシューマーは、PDH.dll の API を使用してパフォーマンス データを収集します。 PDH は、クエリの解析、複数のサンプル間でのインスタンスの照合、生のカウンター データからの書式設定された値の計算など、パフォーマンス カウンターを収集する多くの複雑な側面を管理します。 PDH の実装では、V1 プロバイダーからのデータを使用する場合はレジストリ API を使用し、V2 プロバイダーからのデータを使用する場合は V2 コンシューマー API を使用します。

一部の古いパフォーマンス カウンター コンシューマーでは、レジストリ API を使用して特殊な HKEY_PERFORMANCE_DATA レジストリ キーからパフォーマンス データを収集します。 レジストリからのデータの処理は複雑でエラーが発生しやすいため、新しいコードではこれをお勧めしません。 レジストリ API の実装では、V1 プロバイダーからのデータ収集が直接サポートされています。 V2 コンシューマー API を使用する変換レイヤーを介した V2 プロバイダーからのデータ収集も、間接的にサポートされています。

一部のパフォーマンス カウンター コンシューマーは、PerfLib V2 コンシューマー関数を使用して V2 プロバイダーからのデータに直接アクセスします。 このアプローチは PDH API を介してデータを使用する方法よりも複雑ですが、パフォーマンスや依存関係の問題が原因で PDH API を使用できない場合に役立ちます。 PerfLib V2 の実装では、V2 プロバイダーからのデータ収集が直接サポートされています。 V1 プロバイダーからのデータ収集はサポートされていません。

Note

Windows OneCore には PDH.dll は含まれていません。また、レジストリ API を介したパフォーマンス カウンター データの使用はサポートされていません。 OneCore で実行されているコンシューマーは、PerfLib V2 コンシューマー関数を使用する必要があります。

V1 プロバイダーは、コンシューマー プロセスに読み込まれるプロバイダー DLL として実装されます。 レジストリ API の実装では、プロバイダー DLL の読み込み、DLL の呼び出しによるパフォーマンス データの収集、必要に応じた DLL のアンロードを管理します。 プロバイダー DLL は、たとえば通常の Windows API、RPC、名前付きパイプ、共有メモリ、その他のプロセス間通信メカニズムを使用して、必要に応じてパフォーマンス データを収集する役割を担います。

V2 プロバイダーは、ユーザー モード プログラム (通常は Windows サービス) またはカーネル モード ドライバーとして実装されます。 通常、パフォーマンス データ プロバイダー コードは、既存のコンポーネントに直接統合されます (つまり、ドライバーまたはサービスがそれ自体に関する統計情報を報告します)。 PerfLib V2 の実装では、PCW.sys カーネル拡張機能を介して要求と応答を管理するため、プロバイダーは通常、パフォーマンス データを提供するためにプロセス間通信を実装する必要はありません。

Note

Windows パフォーマンス カウンターの API とツールには、リモート レジストリ (V1 プロバイダーの場合) と RPC (V2 プロバイダーの場合) を介して他のマシンからパフォーマンス カウンターにアクセスするための制限付きサポートが含まれています。 このサポートは通常、認証制御 (ツールと API は現在のユーザーとしてのみ認証可能) やシステム構成 (必要なエンドポイントとサービスは既定で無効) の観点で使用するのは困難です。 多くの場合、組み込みのリモート アクセス サポートではなく、WMI を使用してリモート システムのパフォーマンス カウンターにアクセスすることをお勧めします。

対象となる開発者

通常、管理者はシステムのパフォーマンスの問題や異常な動作を特定するためにパフォーマンス カウンターを使用し、開発者はソフトウェア コンポーネントのリソースの使用状況を調査するためにパフォーマンス カウンターを使用します。また、個々のユーザーはシステムでプログラムがどのように動作しているかを把握するためにパフォーマンスカウンターを使用します。 使用は、タスク マネージャーやパフォーマンス モニターなどの GUI ツール、typeperf.exe や logman.exe などのコマンドライン ツール、WMI および PowerShell を使用したスクリプト、または C/C++ および .NET API を介して行われる場合があります。

パフォーマンス カウンター プロバイダーは通常、カーネルモード ドライバーまたはユーザーモード サービスとして実装されます。 パフォーマンス カウンター プロバイダーは、通常は C または C++ で記述されます。

実行時の要件

特定のプログラミング要素の実行時の要件については、その要素のリファレンス ページの「要件」セクションを参照してください。

バージョン履歴については、新機能に関する記事を参照してください。

関連項目

パフォーマンス カウンターの使用

パフォーマンス カウンター リファレンス