私のプログラムにプロセスとその情報をリストしたいと思います。 /proc/[pid]から最も多くの情報を得ることができます。 top、htopなどは、プロセスの平均負荷をどのように取得しますか?
ベストアンサー1
これジム実行キュー(つまり、実行中または実行待ち)のプロセス(スレッド)の平均数であるシステムの平均数(Linuxの場合)プロセスが中断されていない省電力状態にあります。,D
次の状態)を一定期間内に処理します。
/proc/loadavg
Linuxでは、最後の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/stat
man 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個のスレッドがありました。