マルチユーザーシステムでは、各ユーザーのCPU使用率をCPU時間の秒単位で測定します。この測定のために、PIDがユーザーに属している場合、このユーザーがCPU時間を引き起こしていると想定します。つまり、デーモンとカーネルを無視しています。
現在、5秒ごとにこれを行っています。
- 各ユーザーと彼らが実行しているPIDを取得する
ps aux
- 各PIDについて、get
x
からutime、cutime、stime、cstimeの合計/proc/[pid]/stat
- 計算
t = x / interval
(高負荷の場合、間隔は常に正確に5秒とは限りません)
これを実行すると、賢明な見た目の値が得られます。たとえば、このシステムのユーザーはpython(while True: pass
)で回転しており、システムは毎秒約750ミリ秒のCPU時間を示していました。システムが少しハングしたとき、1秒のインバーバルにつき1600ミリ秒を報告しました。これはほぼ正しいように思えますが、特にこれらの値が本当に理解されていないことを考えると、これらの値が欺くことができることはわかりません。
だから私の質問はこれです:
ユーザーごとにCPU負荷を測定する公正で正しい方法は何ですか?
メソッドはかなり正確でなければなりません。このシステムには何百人ものユーザーが存在する可能性があるためps aux
、特に多くのソフトウェアが生成する短命スレッドの場合、パーセンテージを抽出することは十分に正確ではありません。
これは複雑かもしれませんが、それが可能であることは絶対に知っています。これが私の出発点でした:
カーネルは、プロセスの作成時間と、その存続期間中に消費するCPU時間を追跡します。クロックティックごとに、カーネルは現在のプロセスがシステムモードとユーザーモードで費やした時間を一瞬で更新します。—(Linux Documentation Projectから)
後の値は、ユーザーがCPUに費やした秒数(またはjiffies)であり、システム負荷やCPU使用率のパーセンテージではありません。
プロセスの実行中にCPU時間を測定することが重要です。プロセスのなかには0.5秒しか続かないものもあれば、数か月続くものもあります。両方の種類をキャッチして、ユーザーのCPU時間をきめ細かく把握できるようにする必要があります。
top
バッチモードを実行できることを知っていますか?top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'
その時点で{user}の負荷を表示する必要があります。