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

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

当我执行以下命令来获取 cpu 使用情况时,我得到了很好的+用户 cpu 使用情况。

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

输出:

14.5

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

我想在输出中获取实时 cpu 使用情况。请帮助我提高我的指挥能力。

答案1

你是对的,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}'

答案2

从技术上讲,第一个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

后。

答案3

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

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

答案4

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

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

相关内容