如何使用bash有效地计算CPU利用率?

3

我想要计算单个CPU在Ubuntu系统中的总体CPU利用率。我需要这个系统监控脚本中的总体CPU使用百分比。问题是,当我使用以下代码时,CPU利用率百分比总是相同的:

top -n 1 | grep "Cpu"

我找到了一个替代方案,使用以下代码即可:
read cpu a b c previdle rest < /proc/stat
prevtotal=$((a+b+c+previdle))
sleep 0.5
read cpu a b c idle rest < /proc/stat
total=$((a+b+c+idle))
CPU=$((100*( (total-prevtotal) - (idle-previdle) ) / (total-prevtotal) ))
echo $CPU

这段代码存在的问题是我不确定它是否完全准确。我有几个问题...首先,为什么第一段代码会失败?其次,第二段代码可靠吗?如果不可靠,我该使用哪些代码来获得系统整体CPU利用率的可靠读数?谢谢!
2个回答

3

您的代码正在丢弃IO等待时间,这可能会影响CPU利用率。 您可以参考以下链接,了解每个/ proc / stat /条目对应的内容:

http://man7.org/linux/man-pages/man5/proc.5.html

总体CPU利用率可以通过以下公式计算:

CPU_Util = (user+system+nice+softirq+steal)/(user+system+nice+softirq+steal+idle+iowait)

一个简单的Bash脚本,可以计算50ms内的CPU利用率:

#!/system/bin/sh

# Read /proc/stat file
read cpu user nice system idle iowait irq softirq steal guest< /proc/stat

cpu_active_prev=$((user+system+nice+softirq+steal))
cpu_total_prev=$((user+system+nice+softirq+steal+idle+iowait))

usleep 50000

read cpu user nice system idle iowait irq softirq steal guest< /proc/stat

cpu_active_cur=$((user+system+nice+softirq+steal))
cpu_total_cur=$((user+system+nice+softirq+steal+idle+iowait))

cpu_util=$((100*( cpu_active_cur-cpu_active_prev ) / (cpu_total_cur-cpu_total_prev) ))

echo $cpu_util

1

systat包中提供的mpstat非常好用

您需要使用apt-get安装systat


我不知道我是否做错了什么,但当我执行 while true; do; mpstat; done; 时,即使我运行了多个进程,CPU 利用率的值始终相同。 - Lynx
现在我发现如果你运行mpstat命令而没有任何参数,输出是无意义的...必须像这样使用mpstat 1 1 - Lynx

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