C#でプロセスごとのCPU使用率を算出してみるレイ3月10日読了時間: 2分はじめまして、この記事を書いているレイです。入社してもう少しで半年になる一番社歴の浅いメンバーです。まだまだ未熟ではありますが日々新しい技術や知識を吸収しながら業務に取り組んでいます。今回は業務の中で気づいたことについて書いていきます。先日、あるプロセスのCPU使用率が時間の経過とともに上昇し、パソコンの動作が重くなるという問題に遭遇しました。調査する中で、タスクマネージャーに表示されるCPU使用率は「一定時間の間に、そのプロセスがどれだけCPUを占有していたか」という割合から計算されていることを知りました。OSやタスクマネージャーが「使用率」を算出する仕組みは一見複雑そうに見えますが、単純な時間の計算で求められているのであれば、自作のプログラムでも近い値を再現できるのではないでしょうか。今回は、その仕組みをもとに実際に検証してみます。差分からもとめるC#ではProcessクラスのGetProcesses()メソッドを使うと、実行されているすべてのプロセスのリソース使用状況を取得できます。今回はこの中のTotalProcessorTimeに注目します。このプロパティは「PC起動後からの累積CPU使用時間」を表します。累積時間ではリアルタイムな値が求められないので、2時点間T1、T2の差分からその間にどれだけCPUを使ったのかを求めます。以下の式に当てはめてプロセスごとのCPU使用率を算出します。現在の一般的なCPUには演算、制御処理を行う中核部分「コア」が複数搭載されているので、その個数を分母の間隔時間に積算しています。結果(左:自作ソフト 右:タスクマネージャ)単純な計算ではありますが、実際に試してみるとタスクマネージャーに近い値を取得できることが確認できました。一見ブラックボックスに見えるOSの挙動も、仕組みを追っていくと基本的な計算の積み重ねで成り立っていることが分かります。内部の動きを理解し、それを自分の手で再現できると、普段何気なく使っている仕組みへの理解も少し深まります。今後も身近な技術の仕組みに目を向けながら、少しずつ理解を積み重ねていきたいと思います。今回作成したコードの一部を以下に掲載しています。興味のある方は、ぜひご自身の環境でも試してみてください。コード例
コメント