はじめに
汎用的なプログラムを開発しているときは、個々のプロセスのCPU使用率を把握する必要がありますが、専用機の開発においては、システム全体のCPU使用率を把握しておかなければいけないときが多々あります。
一般的には、タスクマネージャやパフォーマンスモニタでCPU使用率を確認すると思いますが、実動作しているときのCPU使用率をログに保存しておきたいときが意外とあります。
今回は、思った以上に便利に利用できているCPU使用率の取得方法のサンプルを記述しておきます。
概要
CPUの使用率はパフォーマンスカウンターで取得することができます。今回はパフォーマンスカウンターで取得する方法について記述します。
パフォーマンスカウンターでの取得
System.Diagnostics.PerformanceCounterクラスで下記プロパティを設定することで、システムのCPU使用率を取得することができます。
カテゴリ(CategoryName ) :Processor Information
カウンタ(CounterName ) :% Processor Utility
インスタンス(InstanceName ) :_Total
開発環境
コード
パフォーマンスカウンタで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とします。
https://jpwinsup.github.io/blog/2022/07/15/Performance/SystemResource/PerformanceCounterProcessor/
- \Processor Information\ % Processor Utility
システム全体での CPU 使用率
クロック周波数が使用状況に応じて変化する CPU に対応しており、この値は、タスク マネージャ上に表示されている CPU の「使用率」と参照している値が同じです。
パフォーマンス カウンターがベースのクロック周波数を基準に作成されているため、負荷状況に合わせてクロック周波数が変化する CPU が搭載されている場合は、 100% を超えた CPU 使用率が表示される可能性があります。
※ 使用率が 100% を超えた場合、タスクマネージャ上では数値が切り捨てられ、常に 100% と表示されます。