2012-11-23 119 views
3

我正在尝试计算使用bash的单个CPU,Ubuntu系统的整体CPU利用率。我需要一个系统监视脚本的整体CPU使用率百分比。问题是,当我使用下面的代码的CPU利用率百分比始终是相同的:如何有效使用bash来计算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利用率的可靠读取?谢谢!

回答

1

的mpstat在SYSTAT封装是相当不错的

你必须安装使用SYSTAT apt-get的

+0

我不知道我是否做错了什么,但是当我这样做的时候:'虽然是真的;做; mpstat的;完成;'即使我正在运行多个进程,我也始终获得相同的CPU利用率值。 – Lynx

+0

好吧,现在我发现如果你用任何参数运行mpstat命令,输出是无稽之谈......它必须像这样使用'mpstat 1 1' – Lynx

1

你的代码被丢弃IO等待时间,这可能会影响CPU利用率。可以参考下面的链接来查看每个的/ proc/STAT /条目对应于:

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

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

CPU_UTIL =(用户+系统+好的+的softirq +窃取)/(用户+系统+很好+的softirq +窃取+空闲+ 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