2012-11-23 61 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