2024年4月3日水曜日

WindowsでのCPU使用率の計算について

 割と知られていないようなので一応。

実はWindows界隈ではCPUの使用率の計算に二派閥あったりします。
Windows8の時代から始まって、Windows11な現在でも続いています。

一つはタスクマネージャで表示されるCPU使用率です。CPUが処理に費やした時間ではなくて作業量で使用率を計算しています。作業量を評価する基準にCPUのベースクロックを意識しているので、ベースクロックを超えて動作するターボブースト機能を搭載した近年のCPUだと高負荷時には100%を超えます。
しかし計算結果が100%を超えても表示上は100%に丸めちゃっているので、見た目だけは矛盾が出ないようになっています。

もう一つは、SysinternalsのProcess Explorerなど、管理者向けツールなどでよく使われている方法です。これはWindows7まではタスクマネージャもこの方式でした。この派閥は実時間に対するCPU時間で計算しますので、もちろん100%を超えなくなり、タスクマネージャよりも低いCPU使用率が表示されます。

とりあえず、なぜタスクマネージャのCPU負荷の値があんな高い数値なの?という疑問の答えがこれですよ、ということで。

なぜそんな面倒なことをタスクマネージャがしはじめたかのかというと、当時動的にクロックが可変(speedstepとかもう覚えてないでしょ)にできるCPUが普及したことによって、クロック数が下がったまま動作しているマシンと下がっていないマシンではCPUの使用時間が同じだからって仕事量は違うよね同じ負荷とは言えないじゃん!という考えに基づいています。

一方でクロックが落ちてようがなんだろうが、実際にかかった時間との比率こそボトルネックを探すのに便利だろ!クロックは別に監視しとけばいいだろ!!という派閥もあって、それがProcess Explorerなどのツールです。

それぞれごもっともだし、たいていの場合はどちらの方法でもシステムの負荷の監視には役立つと思いますが、違いを知っておけばボトルネックの解消時の参考になるかもしれません。

ご参考: Powershellやプログラムでタスクマネージャと同じ計算結果を得るにはパフォーマンスカウンタ( "Processor Information" の "% Processor Utility" )を参照すれば取得できます。
Process Explorer方式の方法は上記以上にAPI、WMI、パフォーマンスカウンタなどなどから容易に取得可能で、主にCPU負荷の取得という記事があったらこの方法ばかりだと思いますので特に触れません。

PCを新調したのでLinuxサーバからPCを監視する自家製エージェントを仕込む際にふと思いたって記事にしてみました。

ここまでお読みいただいてありがとうございました。

0 件のコメント:

コメントを投稿