我想监视特定 PID 命名空间中所有进程的 CPU 使用情况。我想以编程方式执行此操作(如果可能的话,C)。我知道如何做到这一点,但我想知道 Linux 是否提供了更简单/更好的方法。
例如,我可以仅使用命名空间 init 进程的cutime
和值来获取 CPU 总使用率吗?cstime
另外,如果我挂载命名空间的/proc
文件系统(而不是根命名空间的),是否只会/proc/stat
显示该特定命名空间的 CPU 利用率?
可能的解决方案:
- 在 PID 命名空间内启动一个新进程
- 将命名空间的
/proc
文件系统挂载到安全的地方 - 每隔几毫秒,读取
/proc
目录并计算其中列出的每个进程的 CPU 使用率 - 使用 IPC 将聚合值传递给父进程
答案1
例如,我可以仅使用命名空间 init 进程的
cutime
和值来获取 CPU 总使用率吗?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
稍后编辑名称空间并死亡的进程的时间(也不包括它们等待的子进程(其他进程似乎被名称空间的 init 撕裂))。