在多用户系统上,我想以cpu时间的秒数衡量每个用户的CPU使用率。出于此测量的目的,我假设如果PID属于某个用户,则该用户正在导致CPU时间-也就是说,我忽略了守护进程和内核。
目前,我每五秒钟执行一次:
- 获取每个用户及其正在运行的PID
ps aux
- 对于每一个PID,得到
x
的总和,UTIME,cutime,STIME和cstime从/proc/[pid]/stat
- 计算
t = x / interval
(高负载时间隔并不总是精确地为5秒)
如果运行此命令,则将获得明智的外观值。例如:该系统上的一个用户正在使用python(while True: pass
)旋转,并且该系统每秒显示大约750毫秒的CPU时间。当系统挂起一会儿时,它报告了1600毫秒,时间间隔为1秒。这似乎是正确的,但我已了解,这些值可以是deceiptful,特别是考虑到我并不真正了解他们。
所以我的问题是这样的:
有一种公平,正确的方法来按用户衡量CPU负载?
该方法必须相当准确。该系统上可能有数百个用户,因此从中提取百分比ps aux
将不够准确,尤其是对于许多软件喜欢生成的短寿命线程。
尽管这可能很复杂,但我绝对知道这是可能的。这是我的出发点:
内核跟踪进程的创建时间以及它在生命周期中消耗的CPU时间。每次时钟滴答,内核都会以当前时间更新系统和用户模式所花费的时间。—(来自Linux Documentation Project)
我要输入的值是用户在CPU上花费的秒数(秒),而不是系统负载或cpu使用率的百分比。
重要的是,我们在进程仍在运行时测量CPU时间。有些进程将仅持续半秒,有些进程将持续数月-我们需要同时捕获这两种类型,以便我们能够以精细的粒度考虑用户的CPU时间。
top
可以做批处理模式吗?top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'
此时应显示{user}的负载。