C
計算 PID 命名空間的總 CPU 使用率
我想監視特定 PID 命名空間中所有程序的 CPU 使用率。我想以程式方式進行(如果可能,C)。我知道如何做到這一點,但我想知道 Linux 是否提供了更簡單/更好的方法。
例如,我可以只使用命名空間的 init 程序的
cutime
和cstime
值來獲取總 CPU 使用率嗎?此外,如果我掛載命名空間的/proc
文件系統(而不是根命名空間的),是否/proc/stat
只會顯示該特定命名空間的 CPU 使用率?可能的解決方案:
- 在 PID 命名空間內啟動一個新程序
- 將命名空間的
/proc
文件系統掛載到安全的地方- 每隔幾毫秒,讀取
/proc
目錄併計算其中列出的每個程序的 CPU 使用率- 使用 IPC 將聚合值傳達給父程序
例如,我可以只使用命名空間的 init 程序的
cutime
和cstime
值來獲取總 CPU 使用率嗎?這將僅包括等待(並因此終止)的子代和後代(或在 的情況下被撕裂的程序
init
)的時間。所以你只會得到死去的孤兒的時間。如果您計算命名空間中所有程序的 cuttime 和 cstime 的總和(注意競爭條件),您應該獲得該命名空間中所有目前和過去程序的累積時間,除了那些加入命名空間的程序(如 with
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
andperl
: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 撕掉了))。