3

我正在尝试使用 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 利用率?谢谢!

4

2 回答 2

2

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

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

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

CPU_Util = (用户+系统+nice+softirq+steal)/(用户+系统+nice+softirq+steal+idle+iowait)

一个简单的 bash 脚本可以计算超过 50 毫秒的 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
于 2014-07-24T23:24:46.333 回答
1

sysstat 包中提供的 mpstat 相当不错

您必须使用 apt-get 安装 sysstat

于 2012-11-23T16:43:20.443 回答