如何获得Linux上的整体CPU使用率(例如57%)

例如,我想知道如何使用bash获取系统CPU使用情况并以百分比表示。

样例输出:

57%

如果有多个核心,如果能计算出平均百分比就好了。

505336 次浏览

尝试sysstat包中的mpstat

> 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

然后是一些__abc0或__abc1来解析你需要的信息:

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

看看cat /proc/stat

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

编辑请在复制粘贴此或将此用于任何严肃的工作之前阅读注释。这是一个没有测试和使用,它是一个想法的人谁不想安装一个实用程序或任何发行版的工作。有些人认为你可以“apt-get - install”任何东西。

注意:这不是当前的的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)

你可以试试:

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

编辑:我注意到在另一个用户的回复中%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) }'

不妨用我的解决方案给出一个实际的回应,我的解决方案受到了彼得·利延伯格的启发:

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

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

你也可以平均5个样本,间隔1秒:

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

像这样测试它:

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

查看整体CPU使用率执行此操作。它调用python3并使用跨平台的psutil模块

printf "%b" "import psutil\nprint('{}%'.format(psutil.cpu_percent(interval=2)))" | python3

interval=2部分表示在2秒的阻塞周期内测量总CPU负载。

样例输出:

9.4%

它包含的python程序是这样的:

import psutil


print('{}%'.format(psutil.cpu_percent(interval=2)))

在调用前放置time证明在这种情况下它需要大约2秒的指定间隔时间。下面是调用和输出:

$ time printf "%b" "import psutil\nprint('{}%'.format(psutil.cpu_percent(interval=2)))" | python3
9.5%


real    0m2.127s
user    0m0.119s
sys 0m0.008s

为了查看还有单独的核心的输出,让我们使用下面的python程序。首先,我获得一个python列表(数组),每个cpu;信息,然后我平均该列表中的所有内容,以得到一个“total % cpu”;类型的值。然后我打印出总数和单个核心百分比。

Python程序:

import psutil


cpu_percent_cores = psutil.cpu_percent(interval=2, percpu=True)
avg = sum(cpu_percent_cores)/len(cpu_percent_cores)
cpu_percent_total_str = ('%.2f' % avg) + '%'
cpu_percent_cores_str = [('%.2f' % x) + '%' for x in cpu_percent_cores]
print('Total: {}'.format(cpu_percent_total_str))
print('Individual CPUs: {}'.format('  '.join(cpu_percent_cores_str)))

如果您愿意,可以将其打包成一个极其丑陋的一行bash脚本,就像这样。我必须确保在Python程序中只使用单引号(''),而不是双引号(""),以便将此包装为bash 1-liner工作:

printf "%b" \
"\
import psutil\n\
cpu_percent_cores = psutil.cpu_percent(interval=2, percpu=True)\n\
avg = sum(cpu_percent_cores)/len(cpu_percent_cores)\n\
cpu_percent_total_str = ('%.2f' % avg) + '%'\n\
cpu_percent_cores_str = [('%.2f' % x) + '%' for x in cpu_percent_cores]\n\
print('Total: {}'.format(cpu_percent_total_str))\n\
print('Individual CPUs: {}'.format('  '.join(cpu_percent_cores_str)))\n\
" | python3

示例输出:注意我有8个核,所以在“单个cpu”后面有8个数字:

Total: 10.15%
Individual CPUs: 11.00%  8.50%  11.90%  8.50%  9.90%  7.60%  11.50%  12.30%

对于关于psutil.cpu_percent(interval=2) python调用如何工作的更多信息,请参见这里是官方的psutil.cpu_percent(interval=None, percpu=False)文档:

psutil.cpu_percent(interval=None, percpu=False)

返回一个浮点数,表示当前系统范围内CPU使用率的百分比。当区间为>0.0比较间隔(阻塞)前后的系统CPU时间。当interval为0.0None时,比较自上次调用或模块导入以来的系统CPU时间,立即返回。这意味着第一次调用它时,它将返回一个毫无意义的0.0值,您应该忽略这个值。在这种情况下,为了准确起见,建议在两次调用之间至少使用0.1秒来调用此函数。当percpu为True时,返回一个浮点数列表,表示每个CPU的利用率百分比。列表的第一个元素指向第一个CPU,第二个元素指向第二个CPU,依此类推。列表的顺序在不同的调用中是一致的。

警告:第一次使用interval = 0.0None调用此函数时,它将返回一个无意义的0.0值,您应该忽略该值。

引用:

  1. 堆栈溢出:如何在Python中获得当前CPU和RAM使用情况?< / >
  2. Stack Overflow:在一行命令行中执行多行语句?< / >
  3. 如何显示一个小数点后两位浮动?< / >
  4. 查找一个列表的平均值

相关的

  1. 295608年< a href = " https://unix.stackexchange.com/questions/295599/how-to-show-processes-that-use-more-than-30-cpu/295608 " > https://unix.stackexchange.com/questions/295599/how-to-show-processes-that-use-more-than-30-cpu/295608 # 295608 < / >
  2. https://askubuntu.com/questions/22021/how-to-log-cpu-load < a href = " https://askubuntu.com/questions/22021/how-to-log-cpu-load " > < / >