所有PID的总和是否为系统总时间?


9

为了衡量用户的总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.

(摘自man proc(5)

因此,我的“用户utime”是utime该用户正在运行的所有PID 的总和。

我希望这将为我提供该用户所花费的CPU秒数的准确值。我在正确的轨道上吗?

我不了解或尚未考虑的一些事项:

  • 每个PID都有一个父PID(或零)。但是我正在计算每个PID,而不仅仅是ppid为0的PID。这是否正确?
  • 除了utime,还有stime,cutime和cstime。我需要担心这些吗?我假设utime是PID的cpu秒总数,不计算父级。

如果我使用来计算系统的总cpu时间/proc/uptime,则该值对于所有用户而言都非常接近我的总和,但是两者之间的差异是很大的。例如(以分钟为单位):

system cpu_time:         96.13
sum of users_cputime:   111.45

更正:

对于所有事物,我都会获得“明智的看待”价值。目前,我正在使用utime,stime,cutime和cstime的总和。它报告的值(虽然我不了解它们)与的度量值很好地相关time

如果我完全走错了路,那么还有另一个问题:


/proc/cputime没有有关CPU执行进程所花费时间的任何信息,所以我很困惑您的“系统cpu_time”计算是什么。如果您要用第二个数字做某事,那就是空闲任务所花费的时间;我不知道这实际上意味着什么。
吉尔(Gilles)'所以

1
您的“用户时间”也必须添加所有无效进程中的utime值。您如何考虑这些?
吉尔(Gilles)'所以

嗯 我所谓的“系统cpu时间”只是/ proc / uptime中的第一个值,即“系统秒数”。我以为这太高了,因为它还计算内核线程,但是您可以看到所有“ utime”值的总和仍高于/ proc / utime中的系统时间。据我所知,您的链接说明了原因。虽然要明确:我对这个数字真的不感兴趣。我对“每用户cpu时间”感兴趣。
Stefano Palazzo 2012年

至于第二条评论:目前,我正计划定期(例如每秒)进行测量,这将忽略短暂的过程。
Stefano Palazzo 2012年

因此,您的系统cpu时间计算为($ 1- $ 2 / $ number_of_cups),其中$ 1和$ 2是/proc/uptime?中的值?然后,我想归因于空闲任务的I / O可以解释差异。我对该主题一无所知,所以我怀疑我错过了一些重要的事情:我不希望空闲任务发生太多事情,尤其是考虑到您的用户cputime总和可能会缺少很多生动的过程。
吉尔斯(Gillles)“所以-别再邪恶了”

Answers:


3

记录和跟踪用户CPU时间的传统方法是进程记帐。在Linux上,安装GNU记帐实用程序,通常由名为的软件包提供acct。我不确定在非常短的流程中花费的时间会多么准确,但是它至少会列出所有曾经执行过的流程。

运行lastcomm以获取任何用户执行的所有命令的列表以及每个命令所花费的时间(对于短暂的进程,四舍五入到〜10ms,期望会看到很多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


长时间运行的流程呢?是否sa在报告cpu时间之前等待进程退出?
Stefano Palazzo

@StefanoPalazzo是的,在流程终止时会写入会计数据。据我所知,这也意味着您无法获得系统崩溃后正在运行的进程的数据。
吉尔斯(Gilles)'“ SO-不要邪恶”

这是一个问题-这意味着我无法使用它,因为我们将有许多长期运行的流程。
Stefano Palazzo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.