我不确定是否正确表达了这个问题,我已经尝试阅读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) 返回的结构 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 */
};
Run Code Online (Sandbox Code Playgroud)
这意味着此命令返回进程及其所有子进程的累积用户和系统 CPU 时间。
现在我们需要知道我们可以从中提取什么/proc。在man procin 部分,/proc/[PID]/stat您可以提取以下信息:
(14) utime %lu
此进程在用户模式下被调度的时间量,以时钟滴答为单位(除以 sysconf(_SC_CLK_TCK))。这包括访客时间,guest_time(运行虚拟 CPU 所花费的时间,见下文),因此不知道访客时间字段的应用程序不会在计算中丢失该时间。
(15) stime %lu
此进程在内核模式下被调度的时间量,以时钟滴答为单位(除以 sysconf(_SC_CLK_TCK))。
(16) cutime %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
Run Code Online (Sandbox Code Playgroud)
time命令的输出:
real 0m38,783s
user 0m41,576s
sys 0m16,866s
Run Code Online (Sandbox Code Playgroud)
根据man proc我们需要查看第 14、15、16 和 17 列:192 520 3964 1165所以如果我们总结进程及其子进程在用户/系统 cpu 上花费的时间。
192+3964 = 4156 <=> user 0m41,576s
520+1165 = 1685 <=> sys 0m16,866s
Run Code Online (Sandbox Code Playgroud)
等等,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
Run Code Online (Sandbox Code Playgroud)
并同时使用 watch 监控指标/proc/$$/stat。只要子进程没有完成,计数器就不会更新。当stress结束时,显示在/proc/$$/stat中的值将更新,并以timecommand 和 的第 14 至 17 列之间的类似结果结束/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
Run Code Online (Sandbox Code Playgroud)
在执行过程中,我每秒观察 2 次命令的结果:
cat /proc/11223/stat | cut -d ' ' -f 14-17
0 0 0 0
Run Code Online (Sandbox Code Playgroud)
虽然ps faux | grep stress会给我这个特殊的 PID 作为四个stress线程的父亲。
| 归档时间: |
|
| 查看次数: |
3477 次 |
| 最近记录: |