是否 /proc/磷一世D磷一世DPID/stat 顯示有關子程序的累積 CPU 統計資訊
我不確定是否正確地表達了這個問題,我已經嘗試閱讀
man proc
,但我無法找到正確的答案,也找不到簡單的方法來驗證它。我嘗試獲取一個 PID 的 CPU/RAM 消耗,但我不知道程序將投射多少子程序,我想獲取 CPU 和 RAM 消耗的總量,而不僅僅是主程序。
我知道事實和經驗
/proc/[PID]/io
確實是通過所有子程序累積的,但我想知道,如果可能的話,如果這同樣適用於/proc/[PID]/stat
.
結論:
如果您不想閱讀整個解釋,請閱讀以下內容:
是的,/proc/ 中包含的值
$$ PID $$/stat 允許確定程序及其子程序使用的 CPU 時間量。
但是,您不能將其用於實時監控,因為子 CPU 時間的值僅在子程序死亡時更新。 說明:
根據
man time
時間返回以下統計資訊:這些統計數據包括 (i) 呼叫和終止之間經過的實時時間,(ii) 使用者 CPU 時間(由 times(2) 返回的結構 tms 中的 tms_utime 和 tms_cutime 值的總和),以及 (iii)系統 CPU 時間(times(2) 返回的 struct 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 時間。
現在我們需要知道我們可以從中提取什麼
/proc
。在man proc
in 部分中/proc/[PID]/stat
,您可以提取以下資訊:(14) utime %lu
此程序在使用者模式下調度的時間量,以時鐘節拍為單位(除以 sysconf(_SC_CLK_TCK))。這包括來賓時間、來賓時間(執行虛擬 CPU 所花費的時間,見下文),因此不知道來賓時間欄位的應用程序不會從計算中失去該時間。
(15) stime %lu
此程序在核心模式下被調度的時間量,以時鐘滴答為單位(除以 sysconf(_SC_CLK_TCK))。
(16) cuttime %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 時間,並且它的子程序使用
/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
同時使用watch監控指標
/proc/$$/stat
。只要子程序未完成,計數器就不會更新。結束時stress
,顯示的值將更新,並以command 和 14 到 17 列/proc/$$/stat
之間的相似結果結束。time``/proc
舊編輯
我雖然結束了,但在做了更多研究後,我嘗試了同樣的命令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
雖然
ps faux | grep stress
會給我這個特殊的 PID 作為四個stress
執行緒的父親。