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

时间:2012-11-23 16:33:10

标签: linux bash ubuntu cpu utilization

我正在尝试使用bash计算单个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 个答案:

答案 0 :(得分:1)

systat包中提供的mpstat非常好

您必须使用apt-get

安装systat

答案 1 :(得分:1)

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

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

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

CPU_Util =(用户+系统+不错+ softirq +窃取)/(用户+系统+不错+ softirq +窃取+空闲+爱荷华州)

一个简单的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