DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

パフォーマンスカウンタから値を取得する

パフォーマンスカウンタから情報を取得する簡単な方法を紹介します。なおこの方法は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秒ごとに取得し、表示するものです。

VB.NET
コードを隠すコードを選択
'コンピュータ名
'"."はローカルコンピュータを表す
'コンピュータ名は省略可能(省略時は".")
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
C#
コードを隠すコードを選択
//コンピュータ名
//"."はローカルコンピュータを表す
//コンピュータ名は省略可能(省略時は".")
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関係のパフォーマンスカウンタは、以下のようなページが参考になります。

  • 履歴:
  • 2014/1/7 UACに関する記述を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。