如何从shell中确定当前的CPU利用率?

51

我如何在Linux的shell中确定当前CPU利用率?

例如,我可以像这样获取负载平均值:

cat /proc/loadavg

输出:

0.18 0.48 0.46 4/234 30719

仅供参考,负载平均值并不是 CPU 使用率,尽管它可能间接显示 CPU 使用率。它是一个数字,显示有多少进程正在运行但正在等待资源,无论是 CPU、磁盘还是其他东西。 - hhaamu
我知道这个。事实上,我在评论中表达了这个观点。 - Joel
6
这个问题为什么会被认为是离题的?重复我可以理解,但离题呢? - puk
1
无法回答这个问题,因为它已经关闭了,但是你可以看一下 vmstat,额外的好处是它也适用于 BSD。 - minusf
7个回答

45

Linux 没有任何系统变量可以提供当前 CPU 利用率。相反,你需要多次读取 /proc/stat:每个 cpu(n) 行的列都给出了总 CPU 时间,你需要进行后续读取以获取百分比。查看 此文档 以了解各列的含义。


1
如果这是真的,那么为什么Space的答案有效呢? - Brain2000
12
因为 Space 给出的答案不起作用,它返回的是进程启动以来的平均 CPU 使用率,而不是当前的 CPU 使用率。这个回答才是正确的。 - scai

27

你可以使用 top 或者 ps 命令来检查 CPU 的使用情况。

使用 top: 这将显示你的 CPU 统计数据。

top -b -n 1 |grep ^Cpu

使用ps命令:这将显示每个进程的% CPU使用率。

ps -eo pcpu,pid,user,args | sort -r -k1 | less

此外,您可以编写一个小的 Bash 或 Perl 脚本来读取 /proc/stat 并计算 CPU 使用率。


2
我们尝试过,但是"top -b -n 1"给出的结果非常不准确。 "top"的第一次迭代非常近似,可能会给出10%而不是60%。 - Dénes Tarján
增加迭代次数 -n > 1 会更精确吗?你测试过这种情况吗? - Christian
6
top计算%CPU的方法与ps的不同。参见此答案http://unix.stackexchange.com/questions/58539/top-and-ps-not-showing-the-same-cpu-result。 - BozoJoe
top -b -n 2 | grep Cpu | tail -n 1 | cut -d ' ' -f 7 | cut -d '%' -f 1 - CpnCrunch

13

uptime 命令可以显示过去 1、5、15 分钟的平均负载。


12

1
不幸的是,我需要它立即退出,这样我才能解析输出。我希望有一个文件在/proc中可以读取。 - Joel
1
@Joel:你可以使用top命令读取CPU值并退出。在top命令中使用-b参数。 - Space

7

尝试这个命令:

cat /proc/stat

这将类似于这样:
cpu  55366 271 17283 75381807 22953 13468 94542 0
cpu0 3374 0 2187 9462432 1393 2 665 0
cpu1 2074 12 1314 9459589 841 2 43 0
cpu2 1664 0 1109 9447191 666 1 571 0
cpu3 864 0 716 9429250 387 2 118 0
cpu4 27667 110 5553 9358851 13900 2598 21784 0
cpu5 16625 146 2861 9388654 4556 4026 24979 0
cpu6 1790 0 1836 9436782 480 3307 19623 0
cpu7 1306 0 1702 9399053 726 3529 26756 0
intr 4421041070 559 10 0 4 5 0 0 0 26 0 0 0 111 0 129692 0 0 0 0 0 95 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 369 91027 1580921706 1277926101 570026630 991666971 0 277768 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 8097121
btime 1251365089
processes 63692
procs_running 2
procs_blocked 0

更多细节: http://www.mail-archive.com/linuxkernelnewbies@googlegroups.com/msg01690.html http://www.linuxhowtos.org/System/procstat.htm

6
也许是这样的。
ps -eo pid,pcpu,comm

如果你喜欢解析文本,或只想查看某些进程。

#!/bin/sh
ps -eo pid,pcpu,comm | awk '{if ($2 > 4) print }' >> ~/ps_eo_test.txt

如果您想按进程名称汇总 CPU 使用情况(例如,如果您正在运行生成多个具有相同名称的进程的 Chrome),则可以使用 ps -eo pcpu,comm | awk '{if ($1 > 0.1) arr[$2]+=$1} END {for (key in arr) printf("%s\t%s\n", arr[key], key)}' - Dušan Brejka

-3
你需要对负载平均值进行几秒钟的采样,并从中计算CPU利用率。如果不确定该怎么做,可以获取“top”的源代码并阅读它。

1
谢谢,但是无法从平均负载计算CPU利用率。 - Joel
实际上,有的,再次阅读源代码。我认为,负载平均值是CPU利用率的导数,因此您需要进行某种积分以获得CPU利用率。没有更好的解释方法-只需使用源代码。祝你好运。 - elcuco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接