有没有办法通过一次读取/ proc / stat来计算CPU利用率百分比?

我想问题是,我可以通过读取/ proc / stat一次计算CPU利用率百分比吗?

# head -1 /proc/stat cpu 67891300 39035 6949171 2849641614 118251644 365498 2341854 0 

我正在考虑总结除了IOWait之外的那些专栏(我正在阅读的地方,它被计算在闲置状态),这会给我100%,每个专栏可以变成百分比(列/ 100_百分比)* 100。

  • 用户:在用户模式下执行的正常进程
  • nice:在用户模式下执行的进程
  • 系统:在内核模式下执行的进程
  • 闲置:旋转的拇指
  • Iowait:等待I / O完成
  • irq:服务中断
  • softirq:服务softirqs
  • 偷:不由自主地等待
  • 客人:跑正常的客人
  • guest_nice:运行一个黑客

这是一个可行的方法,或者我完全脱离轨道?

你在正确的轨道上, top使用这个文件为此目的。 但是你需要多读一遍。

利用率是一个随着时间的推移使用的量度。 您可以阅读一次,让您知道主机的正常运行时间(以秒为单位),然后除以该值,但是从机器启动以来,这会给您主机的效用率。

如果你想要一个5秒以上的速率,你会读一次文件,睡5秒,再读一遍,获得计算的差异,除以5。

你的方法是正确的。 你可以使用/ proc / stat作为原始数据,例如rrdtool。 我自己做了这样的事情,所以我知道100%是可能的。 您可以很好地然后绘制整个系统负载或每个核心单独。

这是我自己的一个实例: 在这里输入图像描述

重新表演 – >你可以做到这一点,这不是简单的基础math,我的图表是一个生动的例子。 为了收集数据,我将/ proc / stat的快照制作为一个临时文件放置在ramdisk上,然后parsing该文件以每1分钟收集一次数据。

我如何parsing数据(bash脚本的片段):

 cat=/bin/cat # others defined the same way ...... $cat /proc/stat > /ramdisk/tmp/stat ssCpuRawUser=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $2}'` ssCpuRawNice=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $3}'` #other columns follow ....... #the most important there is that it is an incrementing COUNTER. if [ ! -f ${data_dir}/sys.cpu.rrd ];then $rrdtool create ${data_dir}/sys.cpu.rrd -s 60 \ DS:ssCpuRawUser:COUNTER:300:0:1250000 \ DS:ssCpuRawNice:COUNTER:300:0:1250000 \ DS:ssCpuRawSystem:COUNTER:300:0:1250000 \ DS:ssCpuRawIdle:COUNTER:300:0:1250000 \ DS:ssCpuRawIOwait:COUNTER:300:0:1250000 \ DS:ssCpuRawIRQ:COUNTER:300:0:1250000 \ DS:ssCpuRawSoftIRQ:COUNTER:300:0:1250000 \ RRA:AVERAGE:0.5:1:532800 fi $rrdtool update ${data_dir}/sys.cpu.rrd N:$ssCpuRawUser:$ssCpuRawNice:$ssCpuRawSystem:$ssCpuRawIdle:$ssCpuRawIOwait:$ssCpuRawIRQ:$ssCpuRawSoftIRQ # then in a loop each core the same way until all are parsed. 

将数据导入rrd数据库之后你可以绘制graphics和天空是极限:) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html

如果你想要的话,可能看起来像这样:

 echo $(echo '100'; echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat | awk '{print $5}';echo ')/100') | bc -l) | bc -l 

结果: 97.17000000000000000000

怎么运行的:

 echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat | awk '{print $5}';echo ')/100') 

产生( 1055057784 - 1055058055 )/100然后这条线喂给bc。 将有类似-7.84000000000000000000 ,然后包装它达到100-$(value)并再次进料到BC

在那里: sleep # – 延迟1秒,如果你改变这个值,那么中间结果应该被分成秒数。 $5 – 第五场,按man prochttp://www.linuxhowtos.org/System/procstat.htm

请让我知道如果这不适合你。

或者,如果awk可以做到这一点,只需要两位数字就可以完成更简单,更可读的操作:

  awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat