监控每个用户的总 CPU 时间最公平的方法是什么?

监控每个用户的总 CPU 时间最公平的方法是什么?

在多用户系统中,我想测量每个用户的 CPU 使用率(以秒为单位)。为了进行此测量,我假设如果 PID 属于某个用户,则该用户会占用 CPU 时间 - 也就是说,我忽略了守护进程和内核。

目前我每五秒钟就会执行一次此操作:

  1. 获取每个用户及其正在运行的 PIDps aux
  2. 对于每个 PID,x获取utime、cutime、stime 和 cstime 来自/proc/[pid]/stat
  3. 计算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

相关内容