私のプログラムにプロセスとその情報をリストしたいと思います。 /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個のスレッドがありました。
答え2
システム全体の負荷平均(およびその他の統計)を表示するには、を確認してくださいproc/loadavg
。最初の3つのフィールドは1分、5分、15分の負荷平均であり、これはほとんどのシステムモニタに表示されます。 4番目のフィールドは、スラッシュで区切られた2つの数字で構成されています。 1つ目は実行可能なプロセス数、2つ目はプロセスの総数(スレッドを含む)です。 5番目のフィールドは、システム内の最新のプロセスのPIDです。
より詳細な統計が必要な場合は、netlinkを介してカーネルと通信するか(特に簡単ではありません)、番号付きのディレクトリをスキャンする必要があります/proc
(TOCTOU競合のため信頼できません)。必要な関連ファイルは、おそらく/proc/<PID>/stat
ほとんどのタスクマネージャが表示する他の情報の大部分を含むものです。正確な説明はここに公開するには少し長いですが、man proc
procファイルシステムのマニュアルページ(ターミナル)でよく説明されています。
プロセスの文脈で「負荷」は意味がないということは注目に値する。負荷平均は、特定の期間に実行可能な状態にあるプロセスの平均数です(システムがどれほど忙しいかを測定するのは非常に不都合な尺度ですが、これは別の話です)。したがって、定義によると、特定のプロセスは「ロード」値です。プロセスはシステムにロードを生成しますが、プロセス自体には「ロード」はありません。これに最も近いのは、プロセスが使用するCPU時間です。これはpollinbの上記のファイルから簡単に計算されます(Stéphane Chazelasの答えで計算方法がかなりよく説明されているので、ここでは繰り返しません)。