パフォーマンスカウンタから情報を取得する簡単な方法を紹介します。なおこの方法はWindows NT Server 4.0以上のNT系OSでのみ可能です。
パフォーマンスカウンタから情報を取得するには、PerformanceCounterクラスのRawValueプロパティ、NextValueメソッド、NextSampleメソッドのいずれかを使用します。RawValueプロパティはカウンタの生の値を表し、NextValueメソッドはカウンタの計算値を、NextSampleメソッドは生の値をCounterSample型オブジェクトで返します。(これらの詳しい違いについては、ヘルプ「パフォーマンス カウンタの値の取得」をご覧ください。)
なおWindows Vista以降でUACが有効になっている時は、管理者に昇格しないと失敗するかもしれません。この対処法については、「Vista以降でUACが有効だとファイルの作成等に失敗する問題の対処法」をご覧ください。
次に示す例は、ローカルコンピュータのプロセッサ稼働率(カテゴリ名"Processor"、カウンタ名"%Processor Time"、インスタンス名"_Total"のパフォーマンスカウンタ)を1秒ごとに取得し、表示するものです。
'コンピュータ名 '"."はローカルコンピュータを表す 'コンピュータ名は省略可能(省略時は".") Dim machineName As String = "." 'カテゴリ名 Dim categoryName As String = "Processor" 'カウンタ名 Dim counterName As String = "% Processor Time" 'インスタンス名 Dim instanceName As String = "_Total" 'カテゴリが存在するか確かめる If Not System.Diagnostics.PerformanceCounterCategory.Exists( _ categoryName, machineName) Then Console.WriteLine("登録されていないカテゴリです。") Return End If 'カウンタが存在するか確かめる If Not System.Diagnostics.PerformanceCounterCategory.CounterExists( _ counterName, categoryName, machineName) Then Console.WriteLine("登録されていないカウンタです。") Return End If 'PerformanceCounterオブジェクトの作成 Dim pc As New System.Diagnostics.PerformanceCounter( _ categoryName, counterName, instanceName, machineName) '1秒おきに値を取得する Dim i As Integer For i = 0 To 9 '計算された値を取得し、表示する Console.WriteLine(pc.NextValue()) '1秒待機する System.Threading.Thread.Sleep(1000) Next i
//コンピュータ名 //"."はローカルコンピュータを表す //コンピュータ名は省略可能(省略時は".") string machineName = "."; //カテゴリ名 string categoryName = "Processor"; //カウンタ名 string counterName = "% Processor Time"; //インスタンス名 string instanceName = "_Total"; //カテゴリが存在するか確かめる if (!System.Diagnostics.PerformanceCounterCategory.Exists( categoryName, machineName)) { Console.WriteLine("登録されていないカテゴリです。"); return; } //カウンタが存在するか確かめる if (!System.Diagnostics.PerformanceCounterCategory.CounterExists( counterName, categoryName, machineName)) { Console.WriteLine("登録されていないカウンタです。"); return; } //PerformanceCounterオブジェクトの作成 System.Diagnostics.PerformanceCounter pc = new System.Diagnostics.PerformanceCounter( categoryName, counterName, instanceName, machineName); //1秒おきに値を取得する for (int i = 0; i < 10; i++) { //計算された値を取得し、表示する Console.WriteLine(pc.NextValue()); //1秒待機する System.Threading.Thread.Sleep(1000); }
Visual Studioでは、「ツールボックス」の「コンポーネント」内に「PerformanceCounter」があります。フォームデザイナを使って、「PerformanceCounter」コンポーネントをフォームに配置して使用することもできます。
本題からはそれますが、ここで代表的なカウンタをいくつか紹介します。ここで紹介しているものは、次に紹介するページからの抜粋です。
パフォーマンス カウンタ カテゴリ (パフォーマンス オブジェクト) | カウンタ | 理想最大しきい値 | 説明 |
---|---|---|---|
Processor | % Processor Time | 75% | プロセッサがアイドル以外のスレッドを実行する時間のパーセンテージ |
Interrupts/sec | プロセッサにより異なる。一般的な CPU の場合、1500 割り込み/秒のしきい値を使用すること。 | プロセッサに対して発生しプロセッサが処理するハードウェア 割り込みの秒あたりの平均数 | |
System | Processor Queue Length | プロセッサあたり 2 | プロセッサ待ち行列にあるスレッド数 |
Context switches/sec | 15000 | コンピュータ上のすべてのプロセッサが、あるスレッドから別のスレッドに切り替わる割合を合わせた数値 | |
Memory | Available Mbytes | 4Mバイト | コンピュータ上で実行するプロセスが使用可能な物理メモリの容量(MB単位) |
Pages/sec | 20 | ハード ページフォルトを解決するためにディスクとの間で読み書きされるページの数 | |
PhysicalDisk | % Disk Time | 選択したディスクが読み取りまたは書き込み要求を処理する間に経過した時間のパーセンテージ | |
Disk Reads/sec | メーカーの仕様によって異なる | ディスク上の読み取り速度 | |
Avg. Disk sec/Read | ディスクからデータを読み取る秒単位の平均時間 | ||
LogicalDisk | % Free Space | 15% | 物理ディスク ユニット上にある空き空間と指定の物理ディスク ドライブにある総利用可能空間の割合 |
Network Interface | Bytes Total/sec | インターフェイス上で送受信されるバイトの数 | |
Server | Bytes Total/sec | サーバーがネットワーク間で送受信したバイトの数 |
.NET Framework関係のパフォーマンスカウンタは、以下のようなページが参考になります。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。