ツールなしでプロセス負荷平均を取得する方法

ツールなしでプロセス負荷平均を取得する方法

私のプログラムにプロセスとその情報をリストしたいと思います。 /proc/[pid]から最も多くの情報を得ることができます。 top、htopなどは、プロセスの平均負荷をどのように取得しますか?

ベストアンサー1

これジム実行キュー(つまり、実行中または実行待ち)のプロセス(スレッド)の平均数であるシステムの平均数(Linuxの場合)プロセスが中断されていない省電力状態にあります。D次の状態)を一定期間内に処理します。

/proc/loadavgLinuxでは、最後の1分、5分、15分間使用できます。

現在これらのスレッドが何であるかを確認するには(少なくともpsその/proc/pid/task/tid/statファイルを読み取るとき)、次のことを実行できます。

ps -eLo state,tid,args | awk '$1 ~ [RD]'

または:

grep -ho '.*) [RD]' /proc/[1-9]*/task/*/stat

(おおよそのプロセス名に改行や)文字が含まれていないと仮定します。正確には、3番目以上のフィールドのファイルの)最後の項目から始める必要があります。)

これプロセス負荷実際には言葉にはなりません。おそらくあなたが考えているのは、CPUが一定期間プロセスを実行するのに費やす時間です。

たとえば、topページが1.5秒ごとに印刷されたときにプロセスの%CPUが300%で表示されている場合、これは最後のページが印刷されてから1.5秒間、CPUがそのプロセスに対して合計ジョブ/スレッドを実行したことを意味します。 4.5秒。

この情報を取得するには、期間の開始と終了でutime(14)フィールドと(15)フィールドの合計を取得し(詳細を参照)、stime期間の差の割合を取得します。/proc/pid/statman 5 proc

たとえば、次のようになりますzsh

zmodload zsh/zselect
period=100 # centi-seconds
((clk_tck = $(getconf CLK_TCK)))
for i (1 2) {
  read -rd '' stat < /proc/$pid/stat;
  t[i]=$((${(j:+:)${(s: :)stat##*\)}[12,13]}))
  ((i == 2)) || zselect -t $period
}
printf '%.4g%%\n' $(((t[2] - t[1]) * 100. * 100 / period / clk_tck))

合格するとプロセス負荷、実行キュー内の対応するプロセスの平均スレッド数を意味します(コメントで@Patrickによって提案された定義に従って)。次のようないくつかの例で近似値を得ることができます。

$ (repeat 100 grep -l ') [RD]' /proc/$pid/task/*/stat)|awk 'END{print NR/100}'
16.57

この100個のコマンドを実行するのにかかった時間の間、$pid実行キューには平均16.57個のスレッドがありました。

おすすめ記事