为了测量用户的总 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.
Run Code Online (Sandbox Code Playgroud)
(来自man proc (5))
因此,我的“用户 utime”是utime
该用户正在运行的所有 PID的总和。
我希望这将为我提供该用户花费的 CPU 秒数的准确值。我在正确的轨道上吗?
我还不明白或考虑到的一些事情:
如果我使用 计算系统的总 CPU 时间/proc/uptime
,则该值非常接近我对所有用户的总和,但差异很大。例如(以分钟为单位):
system cpu_time: 96.13
sum of users_cputime: 111.45
Run Code Online (Sandbox Code Playgroud)
更正:
我对各种事物都有“合理的外观”值。目前我正在使用 utime、stime、cutime 和 cstime 的总和。它报告的值,虽然我不理解它们,但与来自time
.
如果我完全在错误的轨道上,还有另一个问题:
记录和跟踪用户 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