当我执行以下命令来获取 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
进程,我们需要三者的总和。因此,我们可以top
在b
atch模式下运行,这允许我们解析其输出。然而,正如所解释的这里,第一次迭代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}'"