每次都获得相同的cpu使用率。


13

当我执行以下命令获取cpu用法时,我得到了+用户cpu用法。

top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' 

输出:

14.5

在这里,我遇到的问题是输出取决于top命令,因此它不会像top命令那样立即更改。因此,我无法立即获得正确的CPU。它给出相同的输出,并且没有变化。

我想在输出中获取实时cpuusage。请帮助我改善命令。


1
问题是?
Dennis Kaarsemaker,2013年

尝试运行以开头的命令time。在我的系统上,只需要0.165s。
2013年

请给我编辑的命令。
Ketan Patel

试试:time (top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' )
2013年

经过不同系统测试后,输出无差异
Ketan Patel 2013年

Answers:


13

您是对的,top似乎在第一次迭代时提供了错误的CPU使用率。您可以像这样解决此问题:

top -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

当然,这将花费两倍的时间,但是无论如何它将起作用。

如果您仍然希望它能更快地工作,则可以使用-d选项,例如对于1秒的总测量时间,请使用其中的一半:

top -d 0.5 -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

serverfault.com/a/436499/134517 也将花费两倍多的时间,因为它将花费大约一秒钟而不是几乎没有。
altendky

除了altendky的评论外,另请参见terdon的回答以解释为什么此问题首先存在。
Ruslan

6

从技术上讲,第一个top并不总是输出相同的值。它仅输出自上次启动以来的平均CPU负载。因为top使用/proc/stat统计增量来计算CPU负载,所以在与零比较时会计算第一个值,从而得出不正确(但WAD)的结果。

如果您不想使用top,则可以直接解析/proc/stat

cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5) "%"}'

这样也更快,更准确。

您可以使用以下命令进行测试stress

stress -c 1 -q &

然后做

killall stress

后。


真好 而且,如果您将命令放在名为“ cpu”的文件中,则watch可以在其上运行:watch -n1 "bash ./cpu"
Brent Faust 2015年

您要解析的awk脚本/proc/stat非常酷,但是它似乎与top的第一次迭代具有相同的缺点:它输出自上次启动以来的平均CPU负载,而不是当前的负载。
pieroxy

5

只是为了扩展@Ruslan的答案,top在用户进程,系统进程和nice进程之间分配CPU使用率,我们需要这三者的总和。因此,我们可以topbatch模式下运行,该模式允许我们解析其输出。然而,正如解释在这里,第1次迭代的top -b开机以来回报百分比,因此,我们至少需要两次迭代(-n 2)来获得当前的百分比。为了加快速度,您可以将d迭代之间的间隔设置为0.01

top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'

4

也许根据ps输出使用这个:

ps aux  | awk 'BEGIN { sum = 0 }  { sum += $3 }; END { print sum }

0

使用watch命令或在shell中进行循环,

watch -n1 "top -b -n1 | grep 'Cpu(s)' | awk '{print \$2 + \$4}'"


手表
也会

0

为什么要关心CPU使用率?的平均负载是一个更好的指标:

cat /proc/loadavg

如果您确实需要CPU使用率,则解析/proc/stat可能是解决方法。


1
平均负载基本上是CPU使用率的时间积分(除以时间)。当用例具有完全不同的用例时,为什么要说整体特征比差异性指标更好呢?另外,/proc/stat它并不能提供CPU使用情况,因此必须两次读取两次,两次读取之间要间隔一段时间,并进行一些计算以获得CPU使用率。就是top这样。
罗斯兰

我无法数学,因此我不得不承认我不太了解积分和微分之间的区别:/“平均负载基本上是CPU使用率的时间积分”-是真的吗?AFAIK一个挂在D状态的进程会导致负载增加,但不会占用CPU。“你为什么要说...”-OP并没有说出他真正想要完成的工作,所以说实话,我只是假设他想衡量他的系统负载,并认为CPU使用率将是最好的指示。 ,所以我指示他进行平均负载。
Martin von Wittich 2013年

从您的链接:“系统将平均负载计算为负载数量的指数阻尼/加权移动平均值。” 和“系统负载是对计算工作量的度量”。D状态不执行任何计算工作。使用的是占用CPU时间的进程。因此,平均负载基本上是一段时间内CPU处于空闲状态的时间百分比(例如,几分钟到几十分钟)。CPU使用率是以毫秒为单位的时间,即CPU处于空闲状态的时间百分比-即,每次读取时都会更新并反映当前状态。
Ruslan 2013年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.