CPU使用率(top命令的输出)如何总和超过100%?

4

我正在编写一个小的Python脚本来测试一些东西。稍后我想用它来创建使用gnuplot的资源使用情况图,但首先需要进行一些测试。

这个脚本看起来像:

import subprocess

result = subprocess.check_output("top -b -n 1 -c", shell=True).split("\n")

head = result[:5]
body = [x for x in result[7:] if x] #removes empty strings

for line in head:
    print line

csum = 0.0
for line in body:
    print line
    csum += float(line.split()[8])

print "CPU usage of all processes added up", csum, "%"

多次运行结果几乎总是显示CPU使用率大于100%,有时甚至超过200%。这怎么可能?
它在虚拟机中运行(virtualbox,ubuntu 14.04 64位),具有两个内核。主机也有两个内核。
所有运行进程的使用值之和不应该始终低于100%吗?我同时运行htop,它向我显示每个内核约50%的负载....
问题可能是某些进程启动了其他进程,并且在top输出中同时显示,而父进程还显示子进程的CPU使用情况? ==> 子进程被计算两次?

2
通常情况下,这个使用方式表示1个核心的100%;如果您有2个核心,它应该增加到200%。如果您稍微多一些,可能是由于四舍五入或采样伪像造成的。 - Francis Colas
好的,谢谢。如果我想看到“真实”的使用情况,将总和除以核心数应该是正确的。 - Simon Hessner
2个回答

12

100% CPU表示对一个CPU/CORE/线程的完全利用。如果你有8个CPU,则最大值将为800%。

如果你有线程,情况就会变得有些复杂,因为一个线程不是真正的CPU,但在Linux上它被视为一个CPU。


4
top中将每个CPU显示为100%被称为"IRIX模式"。可以禁用该模式以将8个CPU的每个CPU显示为12.5%。 - that other guy
好的...知道了 :) 现在我明白了。 - Simon Hessner
有没有更好的方法来查找几个特定进程的CPU使用率?我的意思是除了解析top命令的输出之外。 - Simon Hessner
是的,有的。你可以使用 top -p {你想要监控的进程ID}。 - buqing

3

根据我的经验,我曾遇到一个超大型SQL数据库引起问题的情况。这是因为它导致mysqld(mysql守护进程)执行超出系统内存容量,从而导致服务器崩溃。当我在UNIX中尝试使用“top”命令时,系统显示该进程使用了超过100%的内存。因此,进程可以利用超过100%的系统内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接