[C#] PerformanceCounterでCPU使用率を取得する方法

C#でPerformanceCounterを使用してCPU使用率を取得するには、まずSystem.Diagnostics名前空間をインポートします。

次に、PerformanceCounterクラスのインスタンスを作成し、カテゴリ名を”Processor”、カウンタ名を”% Processor Time”、インスタンス名を”_Total”に設定します。

これにより、全プロセッサの平均使用率を取得できます。

NextValueメソッドを呼び出すことで、現在のCPU使用率を取得できますが、正確な値を得るためには、少し待ってから再度NextValueを呼び出す必要があります。

これにより、CPU使用率の変化をリアルタイムで監視できます。

この記事でわかること
  • C#でCPU使用率を取得する方法
  • PerformanceCounterの設定手順
  • 複数のカウンタを使用する方法
  • CPU使用率のログ記録方法
  • アラートシステムの構築手法

目次から探す

CPU使用率の取得方法

NugetからSystem.Diagnostics.PerformanceCounterを検索してインストールしておく必要があります。

コンソールからの場合は、dotnet add package System.Diagnostics.PerformanceCounterでインストールできます。

必要な名前空間のインポート

C#でCPU使用率を取得するためには、System.Diagnostics名前空間をインポートする必要があります。

この名前空間には、PerformanceCounterクラスが含まれています。

using System.Diagnostics; // PerformanceCounterクラスを使用するため

PerformanceCounterのインスタンス作成

PerformanceCounterクラスのインスタンスを作成することで、CPU使用率を取得する準備が整います。

以下のようにインスタンスを作成します。

PerformanceCounter cpuCounter = new PerformanceCounter();

カウンタの設定

PerformanceCounterを使用するには、いくつかの設定が必要です。

具体的には、カテゴリ名、カウンタ名、インスタンス名を設定します。

カテゴリ名の設定

CPU使用率を取得するためのカテゴリ名は"Processor"です。

このカテゴリには、CPUに関するさまざまなカウンタが含まれています。

cpuCounter.CategoryName = "Processor"; // カテゴリ名を設定

カウンタ名の設定

CPU使用率を取得するためのカウンタ名は"% Processor Time"です。

このカウンタは、CPUの使用率をパーセンテージで示します。

cpuCounter.CounterName = "% Processor Time"; // カウンタ名を設定

インスタンス名の設定

インスタンス名は、特定のCPUコアを指定するために使用します。

全体のCPU使用率を取得する場合は、"_Total"を指定します。

cpuCounter.InstanceName = "_Total"; // インスタンス名を設定

CPU使用率の取得

設定が完了したら、実際にCPU使用率を取得します。

NextValueメソッドの使用

NextValueメソッドを使用して、CPU使用率の値を取得します。

このメソッドは、呼び出すたびに最新の値を返します。

float cpuUsage = cpuCounter.NextValue(); // CPU使用率を取得

正確な値を得るための注意点

NextValueメソッドを初めて呼び出した際には、正確な値が得られないことがあります。

最初の呼び出しの後に、少し待ってから再度呼び出すことで、正確な値を取得できます。

System.Threading.Thread.Sleep(1000); // 1秒待機
float cpuUsage = cpuCounter.NextValue(); // 再度CPU使用率を取得

このようにして、C#を使用してCPU使用率を取得することができます。

実装例

シンプルなコンソールアプリケーション

以下は、シンプルなコンソールアプリケーションでCPU使用率を取得する例です。

このプログラムは、1秒ごとにCPU使用率を表示します。

using System;
using System.Diagnostics;
using System.Threading;
class Program
{
    static void Main()
    {
        // PerformanceCounterのインスタンスを作成
        PerformanceCounter cpuCounter = new PerformanceCounter();
        cpuCounter.CategoryName = "Processor"; // カテゴリ名を設定
        cpuCounter.CounterName = "% Processor Time"; // カウンタ名を設定
        cpuCounter.InstanceName = "_Total"; // インスタンス名を設定
        while (true)
        {
            // 1秒待機
            Thread.Sleep(1000);
            // CPU使用率を取得
            float cpuUsage = cpuCounter.NextValue();
            // 結果を表示
            Console.WriteLine($"CPU使用率: {cpuUsage}%");
        }
    }
}
CPU使用率: 5.0%
CPU使用率: 10.0%
CPU使用率: 15.0%
...

Windowsフォームアプリケーションでの使用

WindowsフォームアプリケーションでCPU使用率を表示するための例です。

このプログラムは、ラベルにCPU使用率を表示します。

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Timers;
public class CpuUsageForm : Form
{
    private Label cpuUsageLabel;
    private PerformanceCounter cpuCounter;
    private System.Timers.Timer timer;
    public CpuUsageForm()
    {
        // ラベルの初期化
        cpuUsageLabel = new Label();
        cpuUsageLabel.Font = new System.Drawing.Font("Arial", 24);
        cpuUsageLabel.Dock = DockStyle.Fill;
        cpuUsageLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
        Controls.Add(cpuUsageLabel);
        // PerformanceCounterのインスタンスを作成
        cpuCounter = new PerformanceCounter();
        cpuCounter.CategoryName = "Processor"; // カテゴリ名を設定
        cpuCounter.CounterName = "% Processor Time"; // カウンタ名を設定
        cpuCounter.InstanceName = "_Total"; // インスタンス名を設定
        // タイマーの設定
        timer = new System.Timers.Timer(1000); // 1秒ごとに更新
        timer.Elapsed += UpdateCpuUsage;
        timer.Start();
    }
    private void UpdateCpuUsage(object sender, ElapsedEventArgs e)
    {
        // CPU使用率を取得
        float cpuUsage = cpuCounter.NextValue();
        // UIスレッドでラベルを更新
        Invoke(new Action(() => cpuUsageLabel.Text = $"CPU使用率: {cpuUsage}%"));
    }
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new CpuUsageForm());
    }
}

リアルタイムモニタリングの実装

リアルタイムでCPU使用率をモニタリングし、一定の閾値を超えた場合にアラートを表示するプログラムの例です。

using System;
using System.Diagnostics;
using System.Threading;
class RealTimeCpuMonitor
{
    static void Main()
    {
        // PerformanceCounterのインスタンスを作成
        PerformanceCounter cpuCounter = new PerformanceCounter();
        cpuCounter.CategoryName = "Processor"; // カテゴリ名を設定
        cpuCounter.CounterName = "% Processor Time"; // カウンタ名を設定
        cpuCounter.InstanceName = "_Total"; // インスタンス名を設定
        while (true)
        {
            // 1秒待機
            Thread.Sleep(1000);
            // CPU使用率を取得
            float cpuUsage = cpuCounter.NextValue();
            // CPU使用率が80%を超えた場合にアラートを表示
            if (cpuUsage > 80)
            {
                Console.WriteLine("警告: CPU使用率が高いです!使用率: " + cpuUsage + "%");
            }
            else
            {
                Console.WriteLine($"CPU使用率: {cpuUsage}%");
            }
        }
    }
}
CPU使用率: 75.0%
CPU使用率: 82.0%
警告: CPU使用率が高いです!使用率: 82.0%
CPU使用率: 70.0%
...

これらの実装例を参考にして、C#でCPU使用率を取得し、さまざまなアプリケーションに応用することができます。

応用例

複数のカウンタを使用したシステムモニタリング

複数のカウンタを使用して、CPU使用率だけでなく、メモリ使用率やディスク使用率なども同時にモニタリングすることができます。

以下は、CPUとメモリの使用率を取得する例です。

using System;
using System.Diagnostics;
using System.Threading;
class SystemMonitor
{
    static void Main()
    {
        // CPU PerformanceCounterのインスタンスを作成
        PerformanceCounter cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
        // メモリ PerformanceCounterのインスタンスを作成
        PerformanceCounter ramCounter = new PerformanceCounter("Memory", "Available MBytes");
        while (true)
        {
            // 1秒待機
            Thread.Sleep(1000);
            // CPU使用率を取得
            float cpuUsage = cpuCounter.NextValue();
            // 利用可能なメモリを取得
            float availableMemory = ramCounter.NextValue();
            // 結果を表示
            Console.WriteLine($"CPU使用率: {cpuUsage}%, 利用可能メモリ: {availableMemory}MB");
        }
    }
}
CPU使用率: 10.0%, 利用可能メモリ: 2048MB
CPU使用率: 15.0%, 利用可能メモリ: 2000MB
...

ログファイルへのCPU使用率の記録

CPU使用率を定期的に取得し、ログファイルに記録するプログラムの例です。

これにより、後で分析するためのデータを蓄積できます。

using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
class CpuUsageLogger
{
    static void Main()
    {
        // PerformanceCounterのインスタンスを作成
        PerformanceCounter cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
        // ログファイルのパス
        string logFilePath = "cpu_usage_log.txt";
        while (true)
        {
            // 1秒待機
            Thread.Sleep(1000);
            // CPU使用率を取得
            float cpuUsage = cpuCounter.NextValue();
            // ログファイルに記録
            File.AppendAllText(logFilePath, $"{DateTime.Now}: CPU使用率: {cpuUsage}%\n");
        }
    }
}

このプログラムを実行すると、cpu_usage_log.txtというファイルにCPU使用率が記録されます。

アラートシステムの構築

CPU使用率が特定の閾値を超えた場合に、アラートを表示するシステムを構築することができます。

以下は、CPU使用率が80%を超えた場合にアラートを表示する例です。

using System;
using System.Diagnostics;
using System.Threading;
class CpuAlertSystem
{
    static void Main()
    {
        // PerformanceCounterのインスタンスを作成
        PerformanceCounter cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
        while (true)
        {
            // 1秒待機
            Thread.Sleep(1000);
            // CPU使用率を取得
            float cpuUsage = cpuCounter.NextValue();
            // CPU使用率が80%を超えた場合にアラートを表示
            if (cpuUsage > 80)
            {
                Console.WriteLine($"警告: CPU使用率が高いです!使用率: {cpuUsage}%");
            }
            else
            {
                Console.WriteLine($"CPU使用率: {cpuUsage}%");
            }
        }
    }
}
CPU使用率: 75.0%
CPU使用率: 82.0%
警告: CPU使用率が高いです!使用率: 82.0%
CPU使用率: 70.0%
...

これらの応用例を通じて、C#を使用してシステムのパフォーマンスを監視し、必要に応じてアクションを取ることができるようになります。

よくある質問

PerformanceCounterを使用する際の注意点は?

PerformanceCounterを使用する際には、以下の点に注意が必要です。

  • 権限: 一部のカウンタは、管理者権限が必要です。

アプリケーションを管理者として実行することを検討してください。

  • 初回呼び出しの遅延: NextValueメソッドを初めて呼び出した際には、正確な値が得られないことがあります。

初回呼び出しの後に、少し待ってから再度呼び出す必要があります。

  • パフォーマンスへの影響: 多数のカウンタを同時に使用すると、パフォーマンスに影響を与える可能性があります。

必要なカウンタのみを使用するようにしましょう。

CPU使用率が正確に取得できない場合の対処法は?

CPU使用率が正確に取得できない場合、以下の対処法を試みてください。

  • 待機時間の調整: NextValueメソッドを呼び出す前に、1秒程度待機することで、より正確な値を取得できます。
  • カウンタの設定確認: カテゴリ名、カウンタ名、インスタンス名が正しく設定されているか確認してください。
  • アプリケーションの実行環境: アプリケーションが実行されている環境(仮想マシンやコンテナなど)によって、CPU使用率の取得に影響が出ることがあります。

実行環境を見直すことも考慮してください。

他のシステムリソースの使用率も取得できる?

はい、PerformanceCounterを使用することで、CPU使用率以外にもさまざまなシステムリソースの使用率を取得できます。

以下は、取得可能なリソースの例です。

  • メモリ使用率: "Memory"カテゴリの"Available MBytes""Committed Bytes"を使用して、メモリの使用状況を取得できます。
  • ディスク使用率: "LogicalDisk"カテゴリを使用して、ディスクの使用状況を取得できます。

例えば、"% Free Space""% Disk Time"などのカウンタがあります。

  • ネットワーク使用率: "Network Interface"カテゴリを使用して、ネットワークの送受信バイト数を取得できます。

これにより、システム全体のパフォーマンスを包括的に監視することが可能です。

まとめ

この記事では、C#を使用してCPU使用率を取得する方法や、実際のアプリケーションでの実装例、さらには応用例について詳しく解説しました。

これにより、システムのパフォーマンスを監視するための具体的な手法を理解することができるでしょう。

今後は、これらの知識を活用して、より効率的なシステムモニタリングやパフォーマンス管理を行ってみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す