ここではPerformanceCounterCategoryクラスの使い方について見ていきます。 PerformanceCounterCategoryクラスはパフォーマンスカウンタのカテゴリを扱うためのクラスです。 このクラスを使うことで、パフォーマンスカウンタで計測できる値のカテゴリやインスタンス名の一覧を取得したり、カテゴリに属するカウンタを作成したりすることができます。 また、環境ごとに使用できるかどうかが異なる可能性のあるカウンタについて調べることができます。

§1 カテゴリの列挙

パフォーマンスカウンタで計測できるすべてのカテゴリを列挙するには、GetCategoriesメソッドを使います。 このメソッドは静的メソッドで、カテゴリを表すPerformanceCounterCategoryのインスタンスを配列で返します。 CategoryNameプロパティを参照することでカテゴリ名を取得できるほか、CategoryHelpプロパティを参照してカテゴリの説明を取得することもできます。

using System;
using System.Diagnostics;

class Sample {
  static void Main()
  {
    foreach (var category in PerformanceCounterCategory.GetCategories()) {
      // CategoryNameとCategoryHelpを表示
      Console.WriteLine("{0} - {1}", category.CategoryName, category.CategoryHelp);
    }
  }
}
実行結果(Windows 7での例)
USB - USB I/O カウンター
Thread - Thread パフォーマンス オブジェクトには、スレッド動作のアスペクトを計測するカウンターがあります。スレッドはプロセッサ上で命令を実行する基本オブジェクトです。実行中のすべてのプロセスには、少なくとも 1 つのスレッドがあります。
Event Tracing for Windows - このコレクションのカウンターは、Windows イベント トレーシング サブシステムのパフォーマンスについて、システム全体のメトリックを示します。
IPHTTPS Global - このコンピューターでの IPHTTPS サーバーの統計です。
HTTP Service Url Groups - URL グループ固有カウンターのセット
ASP.NET - ASP.NET グローバル パーフォーマンス カウンター
Process - Process パフォーマンス オブジェクトには、実行中のプログラムとシステム処理を監視するカウンターがあります。プロセス内のすべてのスレッドは同じアドレス領域を共有し、同じデータへアクセスします。
SMSvcHost 3.0.0.0 - SMSvcHost 3.0.0.0 パフォーマンス カウンタ
  :
  :

完全なリストは文末にまとめています。

既知のカテゴリが存在するかどうかを調べるにはExistsメソッドを使います。 また、コンストラクタにカテゴリ名を指定してPerformanceCounterCategoryのインスタンスを作成することもできます。

using System;
using System.Diagnostics;

class Sample {
  static void Main()
  {
    // カテゴリ名"Processor"のカウンタが存在するかどうか
    Console.WriteLine(PerformanceCounterCategory.Exists("Processor"));

    // カテゴリ名"Processor"のPerformanceCounterCategoryインスタンスを作成
    var category = new PerformanceCounterCategory("Processor");

    // CategoryNameとCategoryHelpを表示
    Console.WriteLine("{0} - {1}", category.CategoryName, category.CategoryHelp);
  }
}
実行結果
True
Processor - Processor パフォーマンス オブジェクトには、プロセッサの処理状況のアスペクトを計測するカウンターがあります。プロセッサは、算術および論理計算の実行、周辺機器の操作の初期化、プロセスのスレッドの実行を行うコンピューターの一部です。コンピューターには複数のプロセッサを実装可能です。プロセッサ オブジェクトは、各プロセッサをオブジェクトのインスタンスとして表します。


§2 カウンタの作成・取得

特定のカテゴリで計測できるカウンタを取得するには、GetCountersメソッドを使います。 このメソッドは、カテゴリに存在するすべてのカウンタ名に対応するPerformanceCounterのインスタンスを配列で返します。

このメソッドは、カテゴリによって引数でカウンタのインスタンス名を指定する必要がある場合とそうでない場合が異なります。 CategoryTypeがMultiInstanceの場合は複数インスタンスのカテゴリ、つまりインスタンス名を指定する必要があり、SingleInstanceの場合は単一インスタンス、つまりインスタンス名を指定する必要はありません。 このメソッドに渡したインスタンス名は、そのままPerformanceCounterを作成する際のインスタンス名と同じとなります。 参考までに、カテゴリとCategoryTypeのリストを文末にまとめています。

GetCountersメソッドを使って特定カテゴリのカウンタを取得する
using System;
using System.Diagnostics;

class Sample {
  static void Main()
  {
    // カテゴリ名"System"のPerformanceCounterCategoryインスタンスを作成
    var categorySystem = new PerformanceCounterCategory("System");

    // インスタンス名を指定せずに、カウンタを取得
    foreach (var pc in categorySystem.GetCounters()) {
      Console.WriteLine("{0,-15} {1,-20} {2,-10}",
                        pc.CategoryName,
                        pc.CounterName,
                        pc.InstanceName);
    }

    Console.WriteLine();

    // カテゴリ名"Processor"のPerformanceCounterCategoryインスタンスを作成
    var categoryProcessor = new PerformanceCounterCategory("Processor");

    // インスタンス名"_Total"に対応するカウンタを取得
    foreach (var pc in categoryProcessor.GetCounters("_Total")) {
      Console.WriteLine("{0,-15} {1,-20} {2,-10}",
                        pc.CategoryName,
                        pc.CounterName,
                        pc.InstanceName);
    }
  }
}
実行結果
System          File Read Operations/sec           
System          File Write Operations/sec           
System          File Control Operations/sec           
System          File Read Bytes/sec            
System          File Write Bytes/sec           
System          File Control Bytes/sec           
System          Context Switches/sec           
System          System Calls/sec               
System          File Data Operations/sec           
System          System Up Time                 
System          Processor Queue Length           
System          Processes                      
System          Threads                        
System          Alignment Fixups/sec           
System          Exception Dispatches/sec           
System          Floating Emulations/sec           
System          % Registry Quota In Use           

Processor       % Processor Time     _Total    
Processor       % User Time          _Total    
Processor       % Privileged Time    _Total    
Processor       Interrupts/sec       _Total    
Processor       % DPC Time           _Total    
Processor       % Interrupt Time     _Total    
Processor       DPCs Queued/sec      _Total    
Processor       DPC Rate             _Total    
Processor       % Idle Time          _Total    
Processor       % C1 Time            _Total    
Processor       % C2 Time            _Total    
Processor       % C3 Time            _Total    
Processor       C1 Transitions/sec   _Total    
Processor       C2 Transitions/sec   _Total    
Processor       C3 Transitions/sec   _Total    

カテゴリ名の場合と同様、既知のカウンタが存在するかどうかを調べるためにCounterExistsメソッドを使うことができます。

§3 インスタンス名の列挙

特定のカテゴリで計測できる対象のインスタンス名を取得するには、GetInstanceNamesメソッドを使います。

using System;
using System.Diagnostics;

class Sample {
  static void Main()
  {
    // カテゴリ名"Processor"のPerformanceCounterCategoryインスタンスを作成
    var category = new PerformanceCounterCategory("Processor");

    // カテゴリで計測できる対象のインスタンス名を列挙
    foreach (var instanceName in category.GetInstanceNames()) {
      Console.WriteLine(instanceName);
    }
  }
}
実行結果
_Total
0
1

カテゴリ名の場合と同様、既知のインスタンスが存在するかどうかを調べるためにInstanceExistsメソッドを使うことができます。

§4 カテゴリの一覧

GetCategoriesメソッドで取得したパフォーマンスカウンタのCategoryNameとCategoryType、CategoryHelpの一覧です。

§4.1 Windows 7 Ultimate

Windows 7 Ultimateで取得されるカテゴリの一覧
CategoryName CategoryType CategoryHelp
.NET CLR Data MultiInstance .Net CLR データです。
.NET CLR Networking MultiInstance ヘルプは使用できません。
.NET CLR Networking 4.0.0.0 MultiInstance System.Net 名前空間のクラスのカウンタです。
.NET Data Provider for Oracle MultiInstance System.Data.OracleClient のカウンタです。
.NET Data Provider for SqlServer MultiInstance System.Data.SqlClient のカウンタです。
.NET Memory Cache 4.0 MultiInstance System.Runtime.Caching.MemoryCache Performance Counters
ASP.NET SingleInstance ASP.NET グローバル パーフォーマンス カウンター
ASP.NET Applications MultiInstance ASP.NET アプリケーション パーフォーマンス カウンター
ASP.NET Apps v4.0.30319 MultiInstance ASP.NET アプリケーション パーフォーマンス カウンター
ASP.NET State Service SingleInstance ASP.NET 状態サービス
ASP.NET v4.0.30319 SingleInstance ASP.NET グローバル パーフォーマンス カウンター
Browser SingleInstance Browser パフォーマンス オブジェクトには、通知、列挙および Browser 伝送の率を計測するカウンターがあります。
Cache SingleInstance Cache パフォーマンス オブジェクトには、ディスクから読み取る必要なしにデータへのアクセス許可がある限り使用されているデータを保管する物理メモリの領域である、ファイル システム キャッシュを監視するカウンターがあります。キャッシュは、通常アプリケーションに使用されるため、アプリケーションの I/O 操作のインジケーターとして監視されます。メモリが十分にある場合にはキャッシュのサイズは大きくなりますが、メモリが少ない場合にはキャッシュのサイズも小さくなり効果的でなくなります。
Client Side Caching SingleInstance 帯域幅消費を削減する SMB BranchCache のパフォーマンス カウンター
Distributed Transaction Coordinator SingleInstance Microsoft 分散トランザクション コーディネーター パフォーマンス カウンター
Event Tracing for Windows SingleInstance このコレクションのカウンターは、Windows イベント トレーシング サブシステムのパフォーマンスについて、システム全体のメトリックを示します。
Event Tracing for Windows Session MultiInstance このコレクションのカウンターは、個々の Windows イベント トレーシング セッションに関連しています。
HTTP Service SingleInstance HTTP サービス カウンターのセット
HTTP Service Request Queues MultiInstance 要求キュー カウンターのセット
HTTP Service Url Groups MultiInstance URL グループ固有カウンターのセット
ICMP SingleInstance ICMP オブジェクト タイプには、ICMP プロトコルを使用しているシステムによって送受信された ICMP メッセージの数を示すカウンターがあります。ICMP プロトコルに関する各種のエラー数もこのタイプのカウンターでカウントされます。
ICMPv6 SingleInstance ICMP オブジェクト タイプには、ICMP プロトコルを使用しているシステムによって送受信された ICMP メッセージの数を示すカウンターがあります。ICMP プロトコルに関する各種のエラー数もこのタイプのカウンターでカウントされます。
IPHTTPS Global MultiInstance このコンピューターでの IPHTTPS サーバーの統計です。
IPsec Driver SingleInstance IPsec Driver は、インターネット プロトコル バージョン 4 とインターネット プロトコル バージョン 6 を介したトラフィックに適用されるインターネット プロトコル セキュリティ (IPsec) ドライバー カウンターのセットです。
IPv4 SingleInstance IP パフォーマンス オブジェクトには、IP プロトコルを使用して送受信される IP データグラムの速度を計測するカウンターがあります。IP プロトコルのエラーを監視するカウンターがあります。
IPv6 SingleInstance IP パフォーマンス オブジェクトには、IP プロトコルを使用して送受信される IP データグラムの速度を計測するカウンターがあります。IP プロトコルのエラーを監視するカウンターがあります。
Job Object MultiInstance アクティブに名前を付けられたジョブ オブジェクトによって収集されたアカウンティングおよびプロセッサの使用データのレポートです。
Job Object Details MultiInstance ジョブ オブジェクトを作成するアクティブなプロセスについての詳細なパフォーマンス情報を表示します。
LogicalDisk MultiInstance Logical Disk パフォーマンス オブジェクトには、ハード ディスクまたは固定ディスク ドライブの論理パーティションを監視するカウンターがあります。パフォーマンス モニターは、論理ディスクを C などのドライブ文字で認識します。
Memory SingleInstance Memory パフォーマンス オブジェクトには、物理メモリおよび仮想メモリの動作を表示するカウンターがあります。物理メモリはランダム アクセス メモリの領域です。仮想メモリは物理メモリ内とディスク上の領域からなります。メモリのカウンターの多くは、ページング (ディスクと物理メモリの間で起こるコードとデータのページ移動) を監視します。過度なページングによるメモリ不足は、システム処理の遅延の原因となります。
MSDTC Bridge 3.0.0.0 SingleInstance MSDTC Bridge 3.0.0.0 パフォーマンス カウンタ
MSDTC Bridge 4.0.0.0 SingleInstance MSDTC Bridge 4.0.0.0 パフォーマンス カウンター
NBT Connection MultiInstance NBT 接続パフォーマンス オブジェクトには、ローカル コンピューターとリモート コンピューター間の NBT 接続に送受信されるバイトの速度を計測するカウンターがあります。接続は、リモート コンピューターの名前によって認識されます。
Network Inspection System SingleInstance Network Inspection System service performance counters
Network Interface MultiInstance Network Interface パフォーマンス オブジェクトには、TCP/IP ネットワーク接続で送受信されるバイトとパケットの率を計測するカウンターがあります。接続エラーを監視するカウンターも含まれます。
Objects SingleInstance Object パフォーマンス オブジェクトには、プロセス、スレッド、ミューテックスおよびセマフォなどのシステムの論理オブジェクトを監視するカウンターがあります。このカウンターの情報によって、不必要なリソースの消費を検出できます。 各オブジェクトは、オブジェクトの基本情報を格納するメモリが必要です。
Offline Files SingleInstance オフライン ファイルのパフォーマンス カウンター
Pacer Pipe MultiInstance Pacer Pipe のパフォーマンス カウンター セットは、パケット スケジューラからのパイプ統計で構成されます。
Paging File MultiInstance Paging File パフォーマンス オブジェクトには、ページング ファイルを監視するカウンターがあります。ページング ファイルは、コミットされた物理メモリをバックアップするディスクで予約された領域です。
Per Processor Network Activity Cycles MultiInstance Per Processor Network Activity Cycles カウンター セットは、各プロセッサにおけるインターフェイスのネットワーク活動に伴うプロセッサ サイクルを計測します。
Per Processor Network Interface Card Activity MultiInstance Per Processor Network Interface Card Activity カウンター セットは、プロセッサごとにネットワーク インターフェイスのネットワーク活動を計測します。
PhysicalDisk MultiInstance Physical Disk パフォーマンス オブジェクトには、ハード ディスクまたは固定ディスク ドライブを監視するカウンターがあります。ディスクは、ファイル、プログラム、ページング データの格納に使用され、これらを取り出すために読み取られたり、変更を記録するために書き込まれたりします。物理ディスク カウンターの値は、分割された論理ディスク (またはパーティション) の合計値となります。
Print Queue MultiInstance 印刷キューに関するパフォーマンス統計情報を表示します。
Process MultiInstance Process パフォーマンス オブジェクトには、実行中のプログラムとシステム処理を監視するカウンターがあります。プロセス内のすべてのスレッドは同じアドレス領域を共有し、同じデータへアクセスします。
Processor MultiInstance Processor パフォーマンス オブジェクトには、プロセッサの処理状況のアスペクトを計測するカウンターがあります。プロセッサは、算術および論理計算の実行、周辺機器の操作の初期化、プロセスのスレッドの実行を行うコンピューターの一部です。コンピューターには複数のプロセッサを実装可能です。プロセッサ オブジェクトは、各プロセッサをオブジェクトのインスタンスとして表します。
Processor Information MultiInstance プロセッサ情報パフォーマンス カウンター セットには、プロセッサの処理状況のアスペクトを計測するカウンターがあります。プロセッサは、算術および論理計算の実行、周辺機器の操作の初期化、プロセスのスレッドの実行を行うコンピューターの一部です。コンピューターには複数のプロセッサが存在します。プロセッサ情報カウンター セットは、各プロセッサをカウンター セットのインスタンスとして表します。
RAS Port MultiInstance RAS オブジェクトの種類は、お使いのシステムの RAS デバイスの各ポートを処理します。
RAS Total SingleInstance RAS オブジェクトの種類は、お使いのシステムの RAS デバイスのすべてを統合したポートを処理します。
ReadyBoost Cache SingleInstance ReadyBoost キャッシュに関するパフォーマンス統計情報を表示します。
Redirector SingleInstance Redirector パフォーマンス オブジェクトには、ローカル コンピューターから発信されるネットワーク接続を監視するカウンターがあります。
Server SingleInstance Server パフォーマンス オブジェクトには、ローカル コンピューターとネットワーク間の通信を計測するカウンターがあります。
Server Work Queues MultiInstance Server Work Queues パフォーマンス オブジェクトには、キューの長さおよびキュー内のオブジェクトを監視するカウンターがあります。
ServiceModelEndpoint 3.0.0.0 MultiInstance ServiceModelEndpoint 3.0.0.0 パフォーマンス カウンタ
ServiceModelOperation 3.0.0.0 MultiInstance ServiceModelOperation 3.0.0.0 パフォーマンス カウンタ
ServiceModelService 3.0.0.0 MultiInstance ServiceModelService 3.0.0.0 パフォーマンス カウンタ
SMSvcHost 3.0.0.0 SingleInstance SMSvcHost 3.0.0.0 パフォーマンス カウンタ
SMSvcHost 4.0.0.0 SingleInstance SMSvcHost 4.0.0.0 パフォーマンス カウンター
Synchronization MultiInstance カーネル同期のためのカウンターで構成されます。同期オブジェクトは、各プロセッサをオブジェクトのインスタンスとして表します。
System SingleInstance System パフォーマンス オブジェクトには、コンポーネント プロセッサの複数のインスタンスに適用されるカウンターがあります。
TCPv4 SingleInstance TCP パフォーマンス オブジェクトでは、TCP プロトコルを使用して送受信される TCP セグメントの率を計測するカウンターがあります。各 TCP 接続状態における TCP 接続数を監視するカウンターも含まれます。
TCPv6 SingleInstance TCP パフォーマンス オブジェクトでは、TCP プロトコルを使用して送受信される TCP セグメントの率を計測するカウンターがあります。各 TCP 接続状態における TCP 接続数を監視するカウンターも含まれます。
Telephony SingleInstance テレフォニー システムです。
Teredo Client MultiInstance Teredo クライアントの統計です。
Teredo Relay MultiInstance このコンピューター上でホストされている Teredo リレーの統計です。
Teredo Server MultiInstance このコンピューターでホストされている Teredo サーバーの統計です。
Terminal Services SingleInstance ターミナル サービス要約情報
Terminal Services Session MultiInstance ターミナル サービス各セッションのリソース モニターです。
Thread MultiInstance Thread パフォーマンス オブジェクトには、スレッド動作のアスペクトを計測するカウンターがあります。スレッドはプロセッサ上で命令を実行する基本オブジェクトです。実行中のすべてのプロセスには、少なくとも 1 つのスレッドがあります。
UDPv4 SingleInstance UDP パフォーマンス オブジェクトには、UDP プロトコルを使用して送受信される UDP データグラムの速度を計測するカウンターがあります。UDP プロトコル エラーを監視するカウンターがあります。
UDPv6 SingleInstance UDP パフォーマンス オブジェクトには、UDP プロトコルを使用して送受信される UDP データグラムの速度を計測するカウンターがあります。UDP プロトコル エラーを監視するカウンターがあります。
USB MultiInstance USB I/O カウンター
WF (System.Workflow) 4.0.0.0 MultiInstance Windows Workflow Foundation パフォーマンス カウンター
WFP SingleInstance WFP は、特定のインターネット プロトコル バージョンに適用しない Windows Filtering Platform カウンターのセットです。
WFPv4 SingleInstance WFPv4 は、インターネット プロトコル バージョン 4 を介したトラフィックと接続に適用される Windows Filtering Platform カウンターのセットです。
WFPv6 SingleInstance WFPv6 は、インターネット プロトコル バージョン 6 を介したトラフィックと接続に適用される Windows フィルタリング プラットフォーム カウンターのセットです。
Windows Workflow Foundation MultiInstance Windows Workflow Foundation パフォーマンス カウンタ
CategoryName CategoryType CategoryHelp

§4.2 Ubuntu 11.04 (Mono 2.10)

Ubuntu 11.04上のMono 2.10で取得されるカテゴリの一覧
CategoryName CategoryType CategoryHelp
.NET CLR Exceptions Unknown
.NET CLR Interop Unknown
.NET CLR JIT Unknown
.NET CLR Loading Unknown
.NET CLR LocksAndThreads Unknown
.NET CLR Memory Unknown
.NET CLR Remoting Unknown
.NET CLR Security Unknown
ASP.NET Unknown
Mono Memory Unknown
Mono Threadpool Unknown
Network Interface Unknown
Process Unknown
Processor Unknown
CategoryName CategoryType CategoryHelp