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

use*_*739 177 unix linux bash cpu

我想知道如何使用bash获取系统CPU使用率并以百分比形式显示它.

样本输出:

57%
Run Code Online (Sandbox Code Playgroud)

如果有一个以上的核心,如果可以计算平均百分比,那就太好了.

vim*_*ude 160

看一眼 cat /proc/stat

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

编辑请在复制粘贴之前阅读评论或将其用于任何认真的工作.这个没有经过测试也没有使用过,对于那些不想安装实用程序的人或任何在任何发行版中工作的人来说都是一个想法.有些人认为你可以"apt-get install"任何东西.

  • 我认为这个解决方案不会显示当前的CPU负载,而是自CPU启动以来的平均CPU负载. (98认同)
  • 但你必须像上面推荐的那样安装mpstat.很多人没有这种灵活性.cat/proc/stat然后管道比你推荐的mpstat容易得多. (11认同)
  • +1不明白为什么解析另一个实用程序比解析`/ proc/stat`更好 (11认同)
  • @jlliagre,是的,这是对的.要计算CURRENT CPU使用率不是平均值,您需要获取$ 1值然后延迟然后获取$ 1值并查看差异.这是当前的cpu使用情况. (11认同)
  • system + user + idle = 100%.所以可能是这样的:grep'cpu'/ proc/stat | awk'{cpu_usage =($ 2 + $ 4)*100 /($ 2 + $ 4 + $ 5)} END {print cpu_usage"%"}' (7认同)
  • 这是一个可怕的答案.我只能想象有多少不幸的人误导了他们.首先,正如@Etienne和@jlliagre提出的那样,这些值反映了自引导以来的总和.其次,如果你打算使用它们,你需要将它们全部加起来 - 即现在内核上的"$ 2"到"$ 10" - 无论你是否打算全部打印它们.在`man proc`中搜索解释...然后走开并使用`mpstat`. (5认同)
  • @vimdude评论应该只是暂时的,请在答案中添加必要部分. (2认同)
  • 怎么样:`awk'{u = $ 2 + $ 4; t = $ 2 + $ 4 + $ 5; 如果(NR == 1){u1 = u; t1 = t;} else print($ 2 + $ 4-u1)* 100 /(t-t1)“%”; }'<(grep'cpu'/ proc / stat)<(sleep 1; grep'cpu'/ proc / stat)` (2认同)
  • 我看到很多复杂的命令,但是一个简单的命令(从这里得到的一些答案中得出)似乎对我有用了`top -b -n2 | grep"Cpu(s)"| awk'{print $ 2 + $ 4"%"}'| tail -n1`我将它与任务管理器报告的CPU使用率进行了比较,它几乎匹配. (2认同)
  • 这不像预期的那样工作:该值与实际的 CPU 负载不对应 (2认同)

net*_*der 97

你可以试试:

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

  • 这个答案中的命令似乎是为`top -v`返回`procps-ng`(例如Fedora)的系统编写的.在例如Ubuntu和CentOS上也发现了`procps`,其中命令不起作用(总是表示100%,因为解析失败是由于CPU数据的格式不同而导致的).这是一个适用于这两种实现的版本:`top -b -n2 -p 1 | fgrep"Cpu(s)"| 尾巴-1 | awk -F'id,' - v prefix ="$ prefix"'{split($ 1,vs,","); V = VS [长度(VS)]; sub("%","",v); printf"%s%.1f %% \n",前缀,100 - v}'` (21认同)
  • 当我使用`top -bn2`时会得到更准确的结果,但需要很长时间.从我所读到的,这似乎是获得准确结果的唯一方法. (13认同)
  • 每次运行此命令时,我都会得到完全相同的输出(`32.7%`). (10认同)
  • 在我的FC20系统上,"top -bn1"似乎非常不准确.`top -bn2`似乎运作良好. (6认同)
  • 附注:在OSX上,使用以下命令:`top -l 2 -n 0 -F | egrep -o'\ d*\.\ d +%idle'| 尾巴-1 | awk -F%-v prefix ="$ prefix"'{printf"%s%.1f %% \n",前缀,100 - $ 1}'`. (2认同)

Pet*_*son 37

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
Run Code Online (Sandbox Code Playgroud)

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

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 -  $ 12}'a
Run Code Online (Sandbox Code Playgroud)

  • 我不相信这显示了总 CPU (2认同)

Dan*_*ego 20

不妨用我的解决方案提出实际的回应,这是受Peter Liljenberg的启发:

$ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }'
0.75%
Run Code Online (Sandbox Code Playgroud)

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

  • 最好运行"mpstat 2 1 | ...",以便显示最后1秒的统计数据.否则,默认情况下,mpstat会在开始后显示统计信息,并且随着时间的推移不会发生太大变化 (13认同)
  • @syntaxerror这需要2秒钟,因为如果你查看命令帮助,你会看到第一个参数是它是间隔但是它只执行一次因为第二个参数所以它等待2整秒直到它返回结果. (6认同)
  • “mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $11"%" }'" 这对我有用。 (2认同)

jor*_*anm 14

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

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

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

  • `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使用情况进行采样 (2认同)
  • 如果您有 jq:`mpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'` (2认同)

Gab*_*les 14

执行此操作可查看总体 CPU 使用情况。这调用python3并使用跨平台psutil模块

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

interval=2部分表示要测量 2 秒阻塞时间内的总 CPU 负载。

示例输出:

9.4%
Run Code Online (Sandbox Code Playgroud)

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

9.4%
Run Code Online (Sandbox Code Playgroud)

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

import psutil

print('{}%'.format(psutil.cpu_percent(interval=2)))
Run Code Online (Sandbox Code Playgroud)

要查看各个内核的输出,让我们使用下面的 python 程序。首先,我获得“每个 CPU”信息的 python 列表(数组),然后对该列表中的所有内容进行平均以获得“总 % CPU”类型值。然后我打印总数和单个核心百分比。

Python程序:

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

real    0m2.127s
user    0m0.119s
sys 0m0.008s
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以将其包装成一个极其丑陋的单行 bash 脚本,如下所示。我必须确保在 Python 程序中仅使用单引号 ( ''),而不是双引号 ( ""),以便将其包装到 bash 1-liner 中:

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)))
Run Code Online (Sandbox Code Playgroud)

示例输出:请注意,我有 8 个核心,因此“Individual CPUs:”后面有 8 个数字:

Total: 10.15%
Individual CPUs: 11.00%  8.50%  11.90%  8.50%  9.90%  7.60%  11.50%  12.30%
Run Code Online (Sandbox Code Playgroud)

有关python 调用如何工作的更多信息psutil.cpu_percent(interval=2),请参阅此处的官方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.0否则None它将返回一个无意义的0.0值,您应该忽略该值。

更进一步:

我在eRCaGuy_dotfiles存储库的cpu_logger.py脚本中使用上述代码。

参考:

  1. Stack Overflow:如何在 Python 中获取当前 CPU 和 RAM 使用情况?
  2. Stack Overflow:在一行命令行中执行多行语句?
  3. 如何显示保留两位小数的浮点数?
  4. 查找列表的平均值

有关的

  1. 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