Linux中如何計算特定CPU使用率

linux中計算特定CPU使用率的方法:首先從【/proc/stat】中獲取 t1時刻系統總體的值;然后從【/proc/stat】中獲取t2時刻系統總的值;最后計算t2與t1之間系統總的CPU使用情況。

Linux中如何計算特定CPU使用率

相關學習推薦:linux視頻教程

Linux中計算特定CPU使用率的方法:

1. 背景知識

在/proc/stat中可以查看每一個CPU的使用情況的,如下圖:

Linux中如何計算特定CPU使用率

其中cpu(0/1/2/…)后面的那十個數字含義如下:

/proc/stat kernel/system?statistics.??Varies?with?architecture.?? Common?entries?include: ?????user?nice?system?idle?iowait??irq??softirq?steal?guest?guest_nice cpu??4705?356??584????3699???23????23?????0???????0?????0????????0 cpu0?1393280?32966?572056?13343292?6130?0?17875?0?23933?0 ???The?amount?of?time,?measured?in?units?of?USER_HZ ???(1/100ths?of?a?second?on?most?architectures,?use ???sysconf(_SC_CLK_TCK)?to?obtain?the?right?value),?that ???the?system?("cpu"?line)?or?the?specific?CPU?("cpuN" ???line)?spent?in?various?states: ???user???(1)?Time?spent?in?user?mode. ???nice???(2)?Time?spent?in?user?mode?with?low?priority ??????????(nice). ???system?(3)?Time?spent?in?system?mode. ???idle???(4)?Time?spent?in?the?idle?task.??This?value ??????????should?be?USER_HZ?times?the?second?entry?in?the ??????????/proc/uptime?pseudo-file. ???iowait?(since?Linux?2.5.41) ??????????(5)?Time?waiting?for?I/O?to?complete.??This ??????????value?is?not?reliable,?for?the?following?rea‐ ??????????sons: ??????????1.?The?CPU?will?not?wait?for?I/O?to?complete; ?????????????iowait?is?the?time?that?a?task?is?waiting?for ?????????????I/O?to?complete.??When?a?CPU?goes?into?idle ?????????????state?for?outstanding?task?I/O,?another?task ?????????????will?be?scheduled?on?this?CPU. ??????????2.?On?a?multi-core?CPU,?the?task?waiting?for?I/O ?????????????to?complete?is?not?running?on?any?CPU,?so?the ?????????????iowait?of?each?CPU?is?difficult?to?calculate. ??????????3.?The?value?in?this?field?may?decrease?in?cer‐ ?????????????tain?conditions. ???irq?(since?Linux?2.6.0-test4) ??????????(6)?Time?servicing?interrupts. ???softirq?(since?Linux?2.6.0-test4) ??????????(7)?Time?servicing?softirqs. ???steal?(since?Linux?2.6.11) ??????????(8)?Stolen?time,?which?is?the?time?spent?in ??????????other?operating?systems?when?running?in?a?virtu‐ ??????????alized?environment ???guest?(since?Linux?2.6.24) ??????????(9)?Time?spent?running?a?virtual?CPU?for?guest ??????????operating?systems?under?the?control?of?the?Linux ??????????kernel. ???guest_nice?(since?Linux?2.6.33) ??????????(10)?Time?spent?running?a?niced?guest?(virtual ??????????CPU?for?guest?operating?systems?under?the?con‐ ??????????trol?of?the?Linux?kernel).

2.計算具體CPU使用率

有了上面的背景知識,接下來我們就可以計算具體CPU的使用情況了。具體計算方式如下:

Total?CPU?time?since?boot?=?user+nice+system+idle+iowait+irq+softirq+steal Total?CPU?Idle?time?since?boot?=?idle?+?iowait Total?CPU?usage?time?since?boot?=?Total?CPU?time?since?boot?-?Total?CPU?Idle?time?since?boot Total?CPU?percentage?=?Total?CPU?usage?time?since?boot/Total?CPU?time?since?boot?*?100%

有了上面的計算公式,計算某一CPU使用率或者系統總的CPU占用率也就是不難了。

示例:計算系統整體CPU占用情況

首先從/proc/stat中獲取 t1時刻系統總體的user、nice、system、idle、iowait、irq、softirq、steal、guest、guest_nice的值,得到此時Total CPU time since boot(記為total1)和 Total CPU idle time since boot(記為idle1)。

其次,從/proc/stat中獲取t2時刻系統總的Total CPU time since boot(記為total2)和Total CPU idle time since boot(記為idle2)。(方法同上一步)

最后,計算t2與t1之間系統總的CPU使用情況。也就是:

CPU?percentage?between?t1?and?t2?=?((total2-total1)-(idle2-idle1))/(total2-total1)*?100%

其中, ((total2-total1)-(idle2-idle1))實際上就是t1與t2時刻之間系統CPU被占用的時間(總時間 – 空閑時間)。

下面是一段計算時間段內CPU被占用情況的腳本:

#!/bin/bash #?by?Paul?Colby?(http://colby.id.au),?no?rights?reserved?;) PREV_TOTAL=0 PREV_IDLE=0 while?true;?do ??#?Get?the?total?CPU?statistics,?discarding?the?'cpu?'?prefix. ??CPU=(`sed?-n?'s/^cpus//p'?/proc/stat`) ??IDLE=${CPU[3]}?#?Just?the?idle?CPU?time. ??#?Calculate?the?total?CPU?time. ??TOTAL=0 ??for?VALUE?in?"${CPU[@]}";?do ????let?"TOTAL=$TOTAL+$VALUE" ??done ??#?Calculate?the?CPU?usage?since?we?last?checked. ??let?"DIFF_IDLE=$IDLE-$PREV_IDLE" ??let?"DIFF_TOTAL=$TOTAL-$PREV_TOTAL" ??let?"DIFF_USAGE=(1000*($DIFF_TOTAL-$DIFF_IDLE)/$DIFF_TOTAL+5)/10" ??echo?-en?"rCPU:?$DIFF_USAGE%??bb" ??#?Remember?the?total?and?idle?CPU?times?for?the?next?check. ??PREV_TOTAL="$TOTAL" ??PREV_IDLE="$IDLE" ??#?Wait?before?checking?again. ??sleep?1 done

? 版權聲明
THE END
喜歡就支持一下吧
點贊13 分享