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 为单位,因为 utime
和 stime
都是。
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 / Hertz
将 starttime
从 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 时的被除数和余数,并以看起来像浮点值的格式打印这些值。
我正在阅读有关计算进程的 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 为单位,因为 utime
和 stime
都是。
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 / Hertz
将 starttime
从 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 时的被除数和余数,并以看起来像浮点值的格式打印这些值。