如何在Linux上获得总体CPU使用率(例如57%)[关闭]


193

我想知道如何获得系统CPU使用率,例如使用bash以百分比表示。

样本输出:

57%

如果有多个核心,则可以计算平均百分比会很好。


1
@julesanchez该值需要通过其他方式传递,因此它必须是int
user1199739 2012年

做top> myfile.txt并在后期处理中应用过滤器,这样不好吗?
JuSchz 2012年

11
不需要sysstat的命令:ps -A -o pcpu | tail -n+2 | paste -sd+ | bc
RF

7
重新打开我不明白为什么这被认为是题外话,关闭它的人是否可以在意?
乔纳森H

3
我的理解/proc/stat非常有限,但是这种单行代码对我来说已经足够好了:cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{printf "%.2f%\n", ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'。使用%.2f,您可以控制要输出的小数位数,sleep 1还可以设置要求平均的时间,即,如果它达到了我的预期。您可以将其放在bash while循环中,以进行实时测试。
Yeti

Answers:


174

看一眼 cat /proc/stat

grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'

编辑之前,请先阅读注释,然后再粘贴粘贴或将其用于任何认真的工作。这未经测试或使用,对于那些不想安装实用程序或在任何发行版中都可以使用的工具的人来说,这是一个好主意。有人认为您可以“随意安装”任何东西。

注意:这不是当前的 CPU使用率,而是自系统启动以来所有内核的总体CPU使用率。这可能与当前的CPU使用情况大不相同。要获得当前值,必须使用top(或类似工具)。

当前的CPU使用率可以通过以下方式计算:

awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' \
<(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)

12
但是您必须像上面建议的那样安装mpstat。许多人没有这种灵活性。cat / proc / stat,然后管道比您建议的mpstat容易得多。
vimdude

12
+1不明白为什么解析另一个实用程序比解析更好/proc/stat
恢复莫妮卡请

9
系统+用户+空闲= 100%。所以也许像这样:grep'cpu'/ proc / stat | awk'{cpu_usage =($ 2 + $ 4)* 100 /($ 2 + $ 4 + $ 5)} END {print cpu_usage“%”}'
vimdude 2014年

106
我认为该解决方案不会显示当前的CPU负载,而是显示自CPU启动以来的平均CPU负载。
Etienne 2014年

11
@jlliagre,是的,没错。要计算当前的CPU使用率而不是平均值,您需要先获取$ 1的值,然后延迟然后再获取$ 1的值,然后看看两者之间的差额。这就是当前的cpu用法。
vimdude

102

你可以试试:

top -bn1 | grep "Cpu(s)" | \
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
           awk '{print 100 - $1"%"}'

11
每次我运行此命令时,都会得到完全相同的输出(32.7%)。
alanaktion

13
当我使用时top -bn2,会给出更准确的结果,但是需要很长时间。根据我的阅读,这似乎是获得准确结果的唯一方法。
alanaktion

6
top -bn1在我的FC20系统上似乎非常不准确。top -bn2似乎运作良好。
马丁·图尔诺伊

23
该答案中的命令似乎是为top -v返回的系统procps-ng(例如Fedora)编写的。在procpsUbuntu和CentOS等上也存在,该命令不起作用(总是表示100%,因为由于CPU数字格式不同而导致解析失败)。这是可同时用于两种实现的版本:top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }'
mklement0

2
旁注:在OSX上,使用以下命令:top -l 2 -n 0 -F | egrep -o ' \d*\.\d+% idle' | tail -1 | awk -F% -v prefix="$prefix" '{ printf "%s%.1f%%\n", prefix, 100 - $1 }'
mklement0

38

mpstatsysstat包装中尝试

> sudo apt-get install sysstat
Linux 3.0.0-13-generic (ws025)  02/10/2012  _x86_64_    (2 CPU)  

03:33:26 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
03:33:26 PM  all    2.39    0.04    0.19    0.34    0.00    0.01    0.00    0.00   97.03

然后一些cutgrep解析您需要的信息:

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 -  $ 12}'a

1
我不相信这会显示总的CPU
user1199739'2

我会说100%空闲是指CPU的总使用率(以百分比为单位)
Peter Svensson 2012年

那是使用的百分比“不”。直到grep为止,这个答案都是好的。尾巴 awk part ...
jordanm 2012年

我会将awk部分更改为:awk -F " " '{print (100 - $12)"%"}',以使输出格式如他所愿,但是对我来说这看起来不错。
Dan Fego

1
@jordanm所有真相;我更赞成它,因为它有效。我个人将这样做:mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'
Dan Fego

22

可能还会在我的解决方案中提出实际的响应,这受到了彼得·利伦贝格(Peter Liljenberg)的启发:

$ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }'
0.75%

这将用于awk打印出100减去第12个字段(空闲),其后带有一个百分号。awk仅对第12个字段仅包含数字和点($12 ~ /[0-9]+/)的行执行此操作。

您还可以平均五个样本,相隔一秒:

$ mpstat 1 5 | awk 'END{print 100-$NF"%"}'

像这样测试它:

$ mpstat 1 5 | tee /dev/tty | awk 'END{print 100-$NF"%"}'

14
最好运行“ mpstat 2 1 | ...”,以便显示最后1秒的统计信息。否则,默认情况下,mpstat会显示自开始以来的统计信息,并且随着时间的推移不会发生太大变化
Sarang 2013年

1
“ mpstat | awk'$ 12〜/[0-9.]+/ {print 100-$ 11”%“}'”对我来说有用。
AloneInTheDark 2014年

@Sarang非常感谢!最后,我也可以获得conky显示的结果。不幸的是,这条线非常慢,几乎要花一秒钟的时间才能执行。
语法错误

6
@syntaxerror大约需要2秒钟,因为如果您查看命令帮助,您会看到第一个参数是间隔,但是由于第二个参数它仅执行一次,因此它等待2整秒钟直到返回结果。
JohanBjäreholt,2015年

问题已经结束,因此请在您的回答中加上我的(类似)答案:-)希望您不要介意。像您一样,我受到Peter Liljenberg的回答的启发。
PJ Brunet

16

编辑:我注意到在另一个用户的答复中,%idle是字段12而不是字段11。awk已更新,以说明%idle字段是可变的。

这应该为您提供所需的输出:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { print 100 - $field }'

如果要简单的整数舍入,可以使用printf:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d%%",100 - $field) }'

2
mpstat 1 1 | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d",100 - $field) }'非常适合我,谢谢。请注意mpstat 1 1以确保在一秒钟内对cpu的使用进行采样
chrishiestand

1
:如果您有JQmpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'
NYET
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.