特定のPID名前空間内のすべてのプロセスのCPU使用率を監視したいと思います。プログラムでこれを行いたい(可能であればC)。私はこれを行う方法を知っていますが、Linuxがより簡単でより良い方法を提供しているかどうか疑問に思います。
たとえば、名前空間初期化プロセスの合計のみを使用して合計CPU使用率を取得できますかcutime
?また、ルート名前空間の代わりに名前空間cstime
のファイルシステムをマウントすると、その特定の名前空間のCPU使用率のみが表示されますか?/proc
/proc/stat
考えられる解決策:
- PID名前空間内で新しいプロセスを開始します。
- 名前空間の
/proc
ファイルシステムを安全な場所にマウントします。 - 数ミリ秒ごとに
/proc
ディレクトリを読み取り、ディレクトリに一覧表示されている各プロセスのCPU使用率を計算します。 - IPCを使用して集計値を親プロセスに渡す
ベストアンサー1
たとえば、名前空間初期化プロセスの合計のみを使用して合計CPU使用率を取得できますか
cutime
?cstime
これには時間のみが含まれます。待機中(したがって終了)子プロセスと子プロセス(またはripped-processesの場合init
)。したがって、死んだ孤児プロセスの時間だけを得ることができます。
名前空間内のすべてのプロセスのcuttimeとcstimeの合計を計算する場合(競合条件注意)、名前空間に結合されたプロセスを除いて、その名前空間内のすべての現在および過去のプロセスの累積時間を取得する必要があります(例:)nsenter -p
。 、時間が計算されます。元の名前空間に親プロセスを入力します(インポートされた名前空間で、このプロセスのPPIDが0であることがわかりました)。
/proc
また、ルート名前空間の代わりに名前空間のファイルシステムをマウントすると、その特定の名前/proc/stat
空間のCPU使用率のみが表示されますか?
確認しやすいです。
$ grep cpu /proc/stat
cpu 69003764 88576 8499514 244070762 5120799 0 407453 0 0 0
cpu0 34269946 49008 4228860 122466614 2365498 0 55409 0 0 0
cpu1 34733818 39567 4270653 121604147 2755300 0 352044 0 0 0
$ sudo unshare --mount-proc -mpf grep cpu /proc/stat
cpu 69005266 88576 8499588 244072663 5120837 0 407462 0 0 0
cpu0 34270449 49008 4228896 122467803 2365522 0 55410 0 0 0
cpu1 34734816 39567 4270692 121604860 2755315 0 352051 0 0 0
だからそうではないようです。
AFAICT、ルート名前空間から統計を計算できる必要があります。
たとえば、pid名前空間の場合と次のようにします$pid
。zsh
perl
perl -l -0777 -ne '
if (/\(.*\)(?: .*?){12} (.*?) (.*?) (.*?) (.*?)/) {$s+=$1+$2+$3+$4}
END{print $s}' /proc/*/ns/pid(e:'[[ $REPLY -ef /proc/$pid/ns/pid ]]'::h:s/ns/stat)
つまり、pidと同じ名前空間内のすべてのプロセスに/ proc / pid / statのフィールド14〜17を追加します$pid
。
前述のように、これにはnsenter
後で名前空間を編集して終了するプロセスの時間は含まれません(また、彼らが待っていた子プロセスも含まれません(他のプロセスは名前空間の初期化のために分離されているように見えます)。