我不确定是否正确地表达了这个问题,我已经尝试阅读man proc
,但我无法找到正确的答案,也找不到简单的方法来验证它。
我尝试获取一个 PID 的 CPU/RAM 消耗,但我不知道程序将投射多少子进程,我想获取 CPU 和 RAM 消耗的总量,而不仅仅是主进程。
我知道事实和经验/proc/[PID]/io
确实是通过所有子进程累积的,但我想知道,如果可能的话,如果这同样适用于/proc/[PID]/stat
.
我不确定是否正确地表达了这个问题,我已经尝试阅读man proc
,但我无法找到正确的答案,也找不到简单的方法来验证它。
我尝试获取一个 PID 的 CPU/RAM 消耗,但我不知道程序将投射多少子进程,我想获取 CPU 和 RAM 消耗的总量,而不仅仅是主进程。
我知道事实和经验/proc/[PID]/io
确实是通过所有子进程累积的,但我想知道,如果可能的话,如果这同样适用于/proc/[PID]/stat
.
结论:
如果您不想阅读整个解释,请阅读以下内容:
是的,/proc/[PID]/stat 中包含的值允许确定进程及其子进程使用的 CPU 时间量。
但是,您不能将其用于实时监控,因为子 CPU 时间的值仅在子进程死亡时更新。
说明:
根据
man time
时间返回以下统计信息:如果有人阅读
man times
,可以了解到该结构定义为:这意味着此命令从进程及其所有子进程返回累积的用户和系统 CPU 时间。
现在我们需要知道我们可以从中提取什么
/proc
。在man proc
in 部分中/proc/[PID]/stat
,您可以提取以下信息:所以基本上这个
/proc/[PID]/stat
文件包含时间用来确定CPU时间的值(以秒为单位)凭借丰富的知识,我尝试像这样运行我的脚本,
time load.sh
并在脚本末尾添加cat /proc/$$/stat
结果如下:命令的输出
time
:根据
man proc
我们需要查看第 14、15、16 和 17 列:192 520 3964 1165
因此,如果我们将进程及其子进程在用户/系统 cpu 中花费的时间相加。等等,CPU 时间并不完全是累积的,但是您可以非常准确地(厘秒)计算程序使用的 CPU 时间,并且它的子程序使用
/proc/[PID]/stat
.编辑:
经过进一步测试并与人们交谈后,我终于得到了答案,我运行了一个仅包含以下内容的脚本:
同时使用watch监控指标
/proc/$$/stat
。只要子进程未完成,计数器就不会更新。结束时stress
,显示的值将更新,并以command 和 14 到 17 列/proc/$$/stat
之间的相似结果结束。time
/proc
旧编辑
我虽然结束了,但在做了更多研究后,我尝试了同样的命令stress
在执行过程中,我每秒观察 2 次命令的结果:
虽然ps faux | grep stress
会给我这个特殊的 PID 作为四个stress
线程的父亲。