实时获取CPU使用率


11

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

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

输出:

14.5

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

我想在输出中获取实时cpu使用情况。请帮助我改善命令。



这个简单的bash脚本就是这样做的:askubuntu.com/a/450136/243213
Craig van Tonder

Answers:


20

如果您可以承受一秒钟的延迟,这将以简单的百分比显示CPU使用率:

echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')]

(没有一秒钟的延迟,vmstat只能在启动后打印平均值。)


没有给我准确的百分比(与htop相比)
lepe

1
您需要这样使用vmstat 1 2echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')] 否则vmstat自启动以来您将要给出值,这可能与您追求的不一样。

乔,谢谢你的工作。请保罗,编辑答案,以便每个人都可以看到正确的命令行
Pavlos Theodorou

感谢您的接见,乔和帕夫洛斯!我没有注意到手册页的那一部分。
Paul

9

这是的已知问题top。正如解释这里的第1次迭代top -b开机以来的回报百分比,因此,我们至少需要两次迭代(-n 2)来获得当前的百分比。为了加快速度,您可以将d两次迭代之间的elay 设置为0.01top在用户,系统进程和nice进程之间划分CPU使用率,我们需要三者之和。最后,您grep包含CPU百分比的行,然后用于gawk对用户,系统和良好的进程求和:

    top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
        -----  ------   -----------    ---------   ----------------------
          |      |           |             |             |------> add the values
          |      |           |             |--> keep only the 2nd iteration
          |      |           |----------------> keep only the CPU use lines
          |      |----------------------------> set the delay between runs
          |-----------------------------------> run twice in batch mode

其他所有方法(包括sar,mpstat等)均显示2/3%,而此命令始终显示50%。
CMCDragonkai 2014年

@CMCDragonkai数字应该更改(我刚刚检查过)您确定正确复制/粘贴了吗?另外,请注意,在具有多个CPU的系统上,top将使用百分比报告单个 CPU 的百分比。这意味着您通常会获得更高的百分比。请参阅此处的第9点。
terdon 2014年

我认为该命令可能与我的系统不兼容。但是很明显,我尝试过的所有其他方法使我获得的百分比为1/2/3%,这是我运行htop时看到的,而此命令给了我一个异常。
CMCDragonkai 2014年

@CMCDragonkai那是因为有多个CPU。您可以获取由此返回的数字并除以内核数,也可以top在交互模式下使用(只需运行top),然后在其中单击I(shift + i)以查看按内核分类的细分。
terdon 2014年

我只有1个CPU。
CMCDragonkai 2014年

7

我尝试了几种方法,但是在我看来,这是最准确的:

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)}'

这里得到


我的Linux(Linux machine_name 4.4.0-127-generic#153-Ubuntu SMP Sat May 19 19:58:46 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux)没有列$ 15(/ proc / stat文件的cpu行) :CPU 17411187 27478 594887 646652526 585551 0 31838 0 0 0
克敏周某

1
最佳答案!谢谢!我的变化:cat <(grep'cpu'/ proc / stat)<(sleep 0.1 && grep'cpu'/ proc / stat)| awk -v RS =“”'{printf“%.1f”,($ 13- $ 2 + $ 15- $ 4)* 100 /($ 13- $ 2 + $ 15- $ 4 + $ 16- $ 5)}'
maXp,

maXp的不同之处在于,它的输出用一个小数点四舍五入:%.1f,在我看来,如果您在其他脚本中使用该输出,则更易于理解和使用。
lepe

0

使用-n2。这将输出两行。第一次top打印该行不符合该时间点的状态。然后调整脚本以忽略第一行。

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.