当我执行以下命令来获取 cpu 使用率时,我得到了很好的 + 用户 cpu 使用率。
top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}'
Run Code Online (Sandbox Code Playgroud)
输出:
14.5
Run Code Online (Sandbox Code Playgroud)
在这里,我遇到的问题是输出取决于 top 命令,因此它不会像 top 命令一样立即更改。所以我没有立即获得正确的 CPU。它提供相同的输出并且不会改变。
我想在输出中获得实时 cpuusage。请帮助我改进我的命令。
Rus*_*lan 15
你是对的,top
似乎在第一次迭代时给出了不正确的 CPU 使用率。您可以像这样解决这个问题:
top -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'
Run Code Online (Sandbox Code Playgroud)
这当然需要两倍的时间,但无论如何它都会起作用。
如果您仍然希望它更快地工作,您可以使用-d
选项,例如对于 1 秒的总测量周期,使用它的一半:
top -d 0.5 -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'
Run Code Online (Sandbox Code Playgroud)
小智 7
从技术上讲,第一个top
并不总是输出相同的值;它只输出自上次启动以来的平均 CPU 负载。因为top
使用/proc/stat
stats的 delta来计算 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) "%"}'
Run Code Online (Sandbox Code Playgroud)
这种方式也更快、更准确。
您可以使用stress
以下方法对其进行测试:
stress -c 1 -q &
Run Code Online (Sandbox Code Playgroud)
并且做
killall stress
Run Code Online (Sandbox Code Playgroud)
后。
只是为了扩展@Ruslan 的答案,top
在用户、系统进程和nice
进程之间分配 CPU 使用率,我们想要三者的总和。因此,我们可以top
在b
atch 模式下运行,这允许我们解析其输出。然而,正如这里所解释的,第一次迭代top -b
返回自启动以来的百分比,因此我们至少需要两次迭代 ( -n 2
) 才能获得当前百分比。为了加快速度,您可以将d
迭代之间的elay设置为0.01
:
top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
Run Code Online (Sandbox Code Playgroud)
在 shell 中使用 watch 命令或 for 循环,
IEwatch -n1 "top -b -n1 | grep 'Cpu(s)' | awk '{print \$2 + \$4}'"
归档时间: |
|
查看次数: |
44335 次 |
最近记录: |