Proc

是否 /proc/磷一世D磷一世DPID/stat 顯示有關子程序的累積 CPU 統計資訊

  • February 1, 2019

我不確定是否正確地表達了這個問題,我已經嘗試閱讀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 procin 部分中/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執行緒的父親。

引用自:https://unix.stackexchange.com/questions/426972