在多用户系统中,我想测量每个用户的 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秒。这似乎是正确的,但我明白这些值可能具有欺骗性,尤其是考虑到我不真的理解他们。
我的问题是这样的:
什么是公平且正确的方法来测量每个用户的 CPU 负载?
该方法必须相当准确。该系统上可能有数百名用户,因此提取百分比ps aux
不够准确,尤其是对于许多软件喜欢生成的短暂线程而言。
虽然这可能很复杂,但我绝对知道这是可能的。这是我的出发点:
内核会跟踪进程的创建时间以及其生命周期内所消耗的 CPU 时间。每个时钟滴答,内核都会更新当前进程在系统和用户模式下所花费的 jiffies 时间。—(来自Linux 文档计划)
我想要的值是用户在 CPU 上花费的秒数(或 jiffies),而不是系统负载或 CPU 使用率的百分比。
在进程仍在运行时测量 CPU 时间非常重要。有些进程只持续半秒,有些则持续数月 - 我们需要捕获这两种情况,以便我们能够精确计算用户的 CPU 时间。
答案1
听起来你需要流程会计。
http://www.faqs.org/docs/Linux-mini/Process-Accounting.html
在 Ubuntu 上,进程记帐工具位于acct
包裹
要获取每个用户的报告,请运行
sa -m
答案2
这将为每个用户提供一行,显示用户名和他们的总 CPU 时间:
ps -w -e --no-header -o uid,user \
| sort -u \
| while read uid user; do
echo -e "$user\t"$(
ps --no-headers -u $uid --cumulative -o time \
| sed -e s/:/*3600+/ -e s/:/*60+/ \
| paste -sd+ \
| bc
);
done
答案3
最明显的答案之一就是扩展您目前正在做的事情。
我碰到了这个使用 bash 脚本和 mysql 来跟踪用户的 CPU 时间的监控过程,但它跨越的时间范围比你所说的要大得多。
希望这可以为您提供有关您所寻求的方向的更多想法。
http://www.dba-oracle.com/t_oracle_unix_linux_vmstat_capture.htm
答案4
这也将处理已经运行了几天的进程..不确定如何扩展数周/数月/数年..
ps -w -e --no-header -o uid,user \
| sort -u \
| while read uid user; do
echo -e "$user\t"$(
ps --no-headers -u $uid --cumulative -o time \
| sed -e s/-/*86400+/ -e s/:/*3600+/ -e s/:/*60+/
| paste -sd+ \
| bc
);
done