【C#】CPU使用率を取得する

プログラミング プログラミング
プログラミング
Sponsored links
Sponsored links

はじめに

汎用的なプログラムを開発しているときは、個々のプロセスのCPU使用率を把握する必要がありますが、専用機の開発においては、システム全体のCPU使用率を把握しておかなければいけないときが多々あります。
一般的には、タスクマネージャパフォーマンスモニタでCPU使用率を確認すると思いますが、実動作しているときのCPU使用率をログに保存しておきたいときが意外とあります。
今回は、思った以上に便利に利用できているCPU使用率の取得方法のサンプルを記述しておきます。

概要

CPUの使用率はパフォーマンスカウンターで取得することができます。今回はパフォーマンスカウンターで取得する方法について記述します。

パフォーマンスカウンターでの取得

System.Diagnostics.PerformanceCounterクラスで下記プロパティを設定することで、システムのCPU使用率を取得することができます。

カテゴリ(CategoryName )    :Processor Information
カウンタ(CounterName )    :% Processor Utility
インスタンス(InstanceName )  :_Total

開発環境

開発環境

PC : NiPoGi AK1PULS
OS : Windows11 Pro 23H2
開発ツール:Microsoft Visual Studio Community 2022 Version 17.11

コード

プロジェクト

・プロジェクトテンプレート
   コンソールアプリ(.NET Framework) C#
・対象のフレームワーク
   .NET Framework 4.8

パフォーマンスカウンタでCPU使用率を取得するサンプル

using System;
using System.Diagnostics;
using System.Threading;

namespace GetCpuUsage
{
    internal class Program
    {
        static void Main(string[] args)
        {
            PerformanceCounter pc = new PerformanceCounter();

            pc.CategoryName = "Processor Information";
            pc.CounterName = "% Processor Utility";
            pc.InstanceName = "_Total";

            // カテゴリが存在するか確かめる
            if (!System.Diagnostics.PerformanceCounterCategory.Exists(pc.CategoryName))
            {
                Console.WriteLine("登録されていないカテゴリです");
                return;
            }
            // カウンタが存在するか確かめる
            if (!PerformanceCounterCategory.CounterExists(pc.CounterName, pc.CategoryName, "."))
            {
                Console.WriteLine("登録されていないカウンタです!");
                return;
            }

            do
            {
                float m = pc.NextValue();

                Console.WriteLine("{0}", m);
                Thread.Sleep(1000);

            } while (true);
        }
    }
}

ここでは、コンソールプログラムでCPU使用率を1秒間隔でコンソールに表示するだけのコードを載せておきました。
実際に利用しているときは、ログに残すように記述しています。
なお、パフォーマンスカウンターで取得したCPU使用率が100%を超えている場合があります。これは、ベースクロックを基準にして作成された使用率のため、クロックが変化すると100%を超えることがあるらしいです。
そこまでシビアにデータを取得することもないのでOKとします。

  • \Processor Information\ % Processor Utility
    システム全体での CPU 使用率
    クロック周波数が使用状況に応じて変化する CPU に対応しており、この値は、タスク マネージャ上に表示されている CPU の「使用率」と参照している値が同じです。
    パフォーマンス カウンターがベースのクロック周波数を基準に作成されているため、負荷状況に合わせてクロック周波数が変化する CPU が搭載されている場合は、 100% を超えた CPU 使用率が表示される可能性があります。
    ※ 使用率が 100% を超えた場合、タスクマネージャ上では数値が切り捨てられ、常に 100% と表示されます。
https://jpwinsup.github.io/blog/2022/07/15/Performance/SystemResource/PerformanceCounterProcessor/

タイトルとURLをコピーしました