![所有 PID“utime”的总和是系统总 utime 吗?](https://linux22.com/image/21160/%E6%89%80%E6%9C%89%20PID%E2%80%9Cutime%E2%80%9D%E7%9A%84%E6%80%BB%E5%92%8C%E6%98%AF%E7%B3%BB%E7%BB%9F%E6%80%BB%20utime%20%E5%90%97%EF%BC%9F.png)
为了测量用户的总 CPU 时间,我使用了以下字段中的“utime”字段/proc/[pid]/stat
:
utime %lu Amount of time that this process has been scheduled in user
mode, measured in clock ticks (divide by
sysconf(_SC_CLK_TCK). This includes guest time, guest_time
(time spent running a virtual CPU, see below), so that
applications that are not aware of the guest time field do
not lose that time from their calculations.
(从人进程 (5))
utime
因此,我的“用户 utime”是该用户正在运行的所有 PID 的总和。
我希望这能为我提供该用户所花费的 CPU 秒数的准确值。我走在正确的轨道上吗?
我还没有理解或考虑到一些事情:
- 每个 PID 还有一个父 PID(或零)。但我正在计算每个 PID,而不仅仅是 ppid 为 0 的 PID。这是正确的吗?
- 除了 utime 之外,还有 stime、cuttime 和 cstime。我需要担心这些吗?我假设 utime 是 PID 的 cpu 秒总数,不包括父进程。
如果我使用计算系统的总CPU时间/proc/uptime
,该值是相当接近我对所有用户的总和,但差异很大。例如(以分钟为单位):
system cpu_time: 96.13
sum of users_cputime: 111.45
更正:
我对各种事物都有“看起来合理”的价值观。目前我正在使用 utime、stime、cuttime 和 cstime 的总和。它报告的值虽然我不理解它们,但与 的测量值密切相关time
。
如果我完全走错了路,那么还有另一个问题:
- 监控每个用户的总 CPU 时间的最公平方法是什么?Ask Ubuntu(+500 赏金)
答案1
记录和跟踪用户 CPU 时间的传统方法是流程会计。在 Linux 上,安装GNU 会计实用程序,通常由名为 的包提供acct
。我不确定它在跟踪非常短暂的进程所花费的时间方面有多准确,但它至少会列出所有曾经执行过的进程。
跑步lastcomm
获取任何用户执行的所有命令以及每个命令所花费的时间的列表(对于短期进程,四舍五入到约 10 毫秒,预计会看到很多0.00
)。跑步sa
显示各种总和和统计数据。特别是,sa -m
显示每个用户的总计。sa
从上次轮转记帐日志(通常位于 )开始运行所累积的统计信息/var/log/account/
。
请注意,您不会通过定期采样来捕获所有进程,但差距相差甚远。您将错过几乎所有短暂的进程和长进程的最后几秒。流程会计确实列出了所有过去的流程。
在 中/proc/$pid/stat
,用户时间是执行计算所花费的时间,而不是执行 I/O 所花费的系统时间。计算哪一项取决于您想如何处理该信息。
统计所有的PID是正确的。我不知道父PID与此有什么关系。
在系统方面,您的描述/proc/uptime
似乎是错误的。维基百科正如我所写的那样。第一个字段是自系统启动以来经过的实际时间,减去挂起或休眠所花费的时间。第二个字段是所有CPU上空闲任务所花费的累计时间。我不确定这到底意味着什么;这当然不是我机器上的总空闲时间。在内核中,对值进行求和在uptime_proc_show
来自更新的变量在account_idle_time
。