pcpu 是什么意思,为什么要乘以 1000?

What does pcpu signify and why multiply by 1000?

我正在阅读有关计算进程的 cpu 使用情况的信息。

seconds = utime / Hertz

total_time = utime + stime

IF include_dead_children
     total_time = total_time + cutime + cstime
ENDIF

seconds = uptime - starttime / Hertz

pcpu = (total_time * 1000 / Hertz) / seconds

print: "%CPU" pcpu / 10 "." pcpu % 10

我不明白的是,根据 'seconds',该算法表示计算机花费在感兴趣进程以外的操作上的时间,以及在此之前。因为,正常运行时间是我们的计算机运行的时间,而启动时间是指我们[感兴趣的]进程启动的时间。

那为什么我们用 total_time 除以 seconds [计算机花在其他事情上的时间] 得到 pcpu?没有意义。

变量的标准含义:

 #  Name      Description
14  utime     CPU time spent in user code, measured in jiffies
15  stime     CPU time spent in kernel code, measured in jiffies
16  cutime    CPU time spent in user code, including time from children
17  cstime    CPU time spent in kernel code, including time from children 
22  starttime Time when the process started, measured in jiffies

/proc/uptime :The uptime of the system (seconds), and the amount of time spent in idle process (seconds).

Hertz        :Number of clock ticks per second

既然您已经提供了每个变量所代表的内容,下面是对伪代码的一些评论:

seconds = utime / Hertz

上面一行毫无意义,因为 seconds 的新值在几行之后被覆盖之前从未使用过。

total_time = utime + stime

进程的总 运行 时间(用户 + 系统),以 jiffies 为单位,因为 utimestime 都是。

IF include_dead_children
     total_time = total_time + cutime + cstime
ENDIF

这应该只是说 total_time = cutime + cstime,因为定义似乎表明,例如cutime 已经包括 utime,加上儿童在用户模式下花费的时间。因此,正如所写的那样,这通过两次包含此过程的贡献而夸大了价值。或者,定义错误...无论如何,total_time 仍然在 jiffies.

seconds = uptime - starttime / Hertz

uptime已经秒了; starttime / Hertzstarttime 从 jiffies 转换为秒,因此 seconds 本质上变成了 "the time in seconds since this process was started".

pcpu = (total_time * 1000 / Hertz) / seconds

total_time 仍然在 jiffies,因此 total_time / Hertz 将其转换为秒,这是进程消耗的 CPU 秒数。如果它是浮点运算,则除以 seconds 将给出自进程启动以来缩放的 CPU 使用百分比。由于不是,因此将其缩放 1000 以提供 1/10% 的分辨率。通过使用括号强制提前完成缩放,以保持准确性。

print: "%CPU" pcpu / 10 "." pcpu % 10

这会撤消缩放,方法是找到除以 pcpu 除以 10 时的被除数和余数,并以看起来像浮点值的格式打印这些值。