PID名前空間の総CPU使用量の計算

PID名前空間の総CPU使用量の計算

特定のPID名前空間内のすべてのプロセスのCPU使用率を監視したいと思います。プログラムでこれを行いたい(可能であればC)。私はこれを行う方法を知っていますが、Linuxがより簡単でより良い方法を提供しているかどうか疑問に思います。

たとえば、名前空間初期化プロセスの合計のみを使用して合計CPU使用率を取得できますかcutime?また、ルート名前空間の代わりに名前空間cstimeのファイルシステムをマウントすると、その特定の名前空間のCPU使用率のみが表示されますか?/proc/proc/stat

考えられる解決策:

  • PID名前空間内で新しいプロセスを開始します。
  • 名前空間の/procファイルシステムを安全な場所にマウントします。
  • 数ミリ秒ごとに/procディレクトリを読み取り、ディレクトリに一覧表示されている各プロセスのCPU使用率を計算します。
  • IPCを使用して集計値を親プロセスに渡す

ベストアンサー1

たとえば、名前空間初期化プロセスの合計のみを使用して合計CPU使用率を取得できますかcutimecstime

これには時間のみが含まれます。待機中(したがって終了)子プロセスと子プロセス(または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名前空間の場合と次のようにします$pidzshperl

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後で名前空間を編集して終了するプロセスの時間は含まれません(また、彼らが待っていた子プロセスも含まれません(他のプロセスは名前空間の初期化のために分離されているように見えます)。

おすすめ記事