DOBON.NET

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

パフォーマンスカウンタから情報を取得する簡単な方法を紹介します。なおこの方法は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 Time75%プロセッサがアイドル以外のスレッドを実行する時間のパーセンテージ
Interrupts/secプロセッサにより異なる。一般的な CPU の場合、1500 割り込み/秒のしきい値を使用すること。
プロセッサに対して発生しプロセッサが処理するハードウェア 割り込みの秒あたりの平均数
SystemProcessor Queue Lengthプロセッサあたり 2プロセッサ待ち行列にあるスレッド数
Context switches/sec15000コンピュータ上のすべてのプロセッサが、あるスレッドから別のスレッドに切り替わる割合を合わせた数値
MemoryAvailable Mbytes4Mバイトコンピュータ上で実行するプロセスが使用可能な物理メモリの容量(MB単位)
Pages/sec20ハード ページフォルトを解決するためにディスクとの間で読み書きされるページの数
PhysicalDisk% Disk Time選択したディスクが読み取りまたは書き込み要求を処理する間に経過した時間のパーセンテージ
Disk Reads/secメーカーの仕様によって異なるディスク上の読み取り速度
Avg. Disk sec/Readディスクからデータを読み取る秒単位の平均時間
LogicalDisk% Free Space15%物理ディスク ユニット上にある空き空間と指定の物理ディスク ドライブにある総利用可能空間の割合
Network InterfaceBytes Total/secインターフェイス上で送受信されるバイトの数
ServerBytes Total/secサーバーがネットワーク間で送受信したバイトの数

.NET Framework関係のパフォーマンスカウンタは、以下のようなページが参考になります。

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

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

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

この記事への評価

この記事へのコメント

この記事に関するコメントを投稿するには、下のボタンをクリックしてください。投稿フォームへ移動します。通常のご質問、ご意見等は掲示板へご投稿ください。