/proc/[PID]/stat サブプロセスの累積 CPU 統計を表示するかどうか

/proc/[PID]/stat サブプロセスの累積 CPU 統計を表示するかどうか

質問を正しく表現したかどうかはわかりません。読んでみましたが、man proc正解が見つからず、これを確認する簡単な方法もありませんでした。
PIDのCPU / RAM消費量を取得しようとしていますが、プログラムがキャストするサブプロセスの数を知らず、メインプロセスだけでなくCPUとRAMの消費量の合計量を取得したいと思います。
事実と経験はすべての子プロセスを通して蓄積されることを知っていますが/proc/[PID]/io、可能であれば同じことが当てはまると証拠を提供するかどうかを知りたいです/proc/[PID]/stat

ベストアンサー1

結論として:
完全な説明を読みたくない場合は、次の内容をお読みください。
はい、/proc/[PID]/stat に含まれる値を使用すると、プロセスとそのサブプロセスで使用される CPU 時間の量を決定できます。
ただし、子プロセスのCPU時間値は、子プロセスが終了したときにのみ更新されるため、リアルタイム監視には使用できません。

説明する:
時間に基づいてman time次の統計を返します。

これらの統計には、(i)呼び出しと終了の間に経過したリアルタイム時間、(ii)ユーザーCPU時間(times(2)から返された構造体tmsのtms_utimeとtms_cutime値の合計)、(iii)システムCPU時間((2) )返されたtms構造のtms_stimeとtms_cstimeの値の合計。

誰でも読むと、man times構造が次のように定義されていることがわかります。

struct tms {
   clock_t tms_utime;  /* user time */
   clock_t tms_stime;  /* system time */
   clock_t tms_cutime; /* user time of children */
   clock_t tms_cstime; /* system time of children */
};

これは、コマンドがプロセスとすべての子プロセスの累積ユーザーとシステムCPU時間を返すことを意味します。
今、私たちはそれから何を抽出できるかを知る必要があります/procman procセクションから/proc/[PID]/stat次の情報を抽出できます。

(14)utime%lu
ユーザーモードでプロセスがスケジュールされた時間(クロックサイクル)(sysconf(_SC_CLK_TCK)で割った)。これには、guest_timeフィールドを認識しないアプリケーションが計算でこの時間を失わないようにguest_time(仮想CPUを実行するのにかかる時間、以下を参照)が含まれます。
(15)stime%lu
カーネルモードでプロセスがスケジュールされた時間(クロックサイクル)(sysconf(_SC_CLK_TCK)で割った)。
(16)cutime%ld
このプロセスの待機中の子プロセスがユーザーモードでスケジュールされた時間(クロックサイクル(sysconf(_SC_CLK_TCK)で割った))です。 (times(2)も参照してください。)これには、ゲスト時間cguest_time(仮想CPUの実行に費やされた時間、以下を参照)が含まれます。
(17)cstime%ld
プロセスの待機中のサブプロセスがカーネルモードで予約された時間(クロックサイクル(sysconf(_SC_CLK_TCK)で割った))です。

したがって、デフォルトでは、この/proc/[PID]/statファイルにはCPU時間を秒単位で決定するために使用される時間値が含まれています。

time load.shこの知識に基づいて、次のようにスクリプトを実行し、スクリプトの終わりを追加してみました。cat /proc/$$/stat結果は次のとおりです。

9398 (load.sh) S 5379 9398 5379 34817 9398 4194304 1325449 7562836 0 0 192 520 3964 1165 20 0 1 0 814903 14422016 1154 18446744073709551615 4194304 5242124 140726473818336 0 0 0 65536 4 65538 1 0 0 17 3 0 0 818155 0 0 7341384 7388228 9928704 140726473827029 140726473827049 140726473827049 140726473830382 0  

コマンドの出力は次のとおりですtime

real    0m38,783s
user    0m41,576s
sys     0m16,866s

必要に応じて、man proc列14、15、16、および17を参照してください。192 520 3964 1165したがって、ユーザー/システムCPUでプロセスとその子孫が費やした時間を合計してみましょう。

192+3964 = 4156  <=>  user 0m41,576s
520+1165 = 1685  <=>  sys  0m16,866s

しばらく、CPU時間は正確に蓄積されませんが、プログラムとそのサブプロセスで使用されるCPU時間を非常に正確に(100分の1秒)計算できます/proc/[PID]/stat

編集する:
追加のテストと人々との会話の最後についに答えを得て、次のようなスクリプトを実行しました。

#!/bin/bash
sleep 5
time stress --cpu 4 -t 60s --vm-hang 15
sleep 5
cat /proc/$$/stat | cut -d ' ' -f 14-17
exit

/proc/$$/statそして同時にインジケータを監視するために時計を使用します。子プロセスが完了しない限り、カウンタは更新されません。完了すると、stressに表示されている値が/proc/$$/stat更新され、timeコマンド/procと列14と17の間に同様の結果が表示されます。

古い編集 すべてが終わったと思いましたが、さらに調査した後、コマンドを使用して同じことを試しました。stress

time stress --cpu 4 -t 60s  
stress: info: [18598] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
stress: info: [18598] successful run completed in 60s
real    1m0,003s
user    3m53,663s
sys     0m0,349s

実行中に毎秒2回のコマンド結果を観察します。

cat /proc/11223/stat | cut -d ' ' -f 14-17
0 0 0 0

しかし、これは4つのスレッドの父親ps faux | grep stressとしてこの特定のPIDを提供します。stress

おすすめ記事