是否可以通过立即读取/ proc / stat来计算CPU利用率百分比?


12

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

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

我正在考虑对除IOWait以外的列进行汇总(我正在阅读某个地方,它被认为是空闲的),这将给我100%,并且每个单独的列都可以乘以(column / 100_percent)* 100的百分比。

  • 用户:在用户模式下执行的正常进程
  • nice:在用户模式下执行的进程
  • 系统:以内核模式执行的进程
  • 闲着:颤抖的拇指
  • iowait:等待I / O完成
  • irq:服务中断
  • softirq:服务softirqs
  • 偷:非自愿等待
  • 客人:运行普通客人
  • guest_nice:运行友好的访客

这是可行的方法还是我完全偏离了轨道?

Answers:


11

您处在正确的轨道上,top将此文件用于此目的。但是您需要阅读多次。

利用率是对一段时间使用情况的一种衡量。如果知道主机的正常运行时间(以秒为单位),就可以阅读一次,然后除以该时间,但这将为您提供主机自启动以来的主机利用率。

如果您希望速率超过5秒,则可以读取一次文件,休眠5秒钟,再读取一次,获得计算的差值并除以5。


6

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

这是我自己的一个工作示例: 在此处输入图片说明

重新假设->您可以做到,不仅仅是基本数学并不难,我的图表就是一个生动的例子。为了收集数据,我将/ proc / stat的快照制作到位于ramdisk上的临时文件中,然后我解析该文件以每1分钟收集一次数据。

我如何解析数据(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数据库之后,您可以进行图形显示,并且天空是极限:) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html


您如何解析数据?
ewwhite 2014年

@ewwhite->我编辑了答案,以显示如何解析数据。
巴特洛梅耶Zarzecki

漂亮的图!关于缺少的列注释:askubuntu.com/a/120961/451886。如果它在VM中运行,则可能是“偷”计数器。
rkagerer

rrdtool和ramdisk +1!
shadi

4

如果您想要单件套,它可能看起来像这样:

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的第5个字段

如果这不适合您,请告诉我。


0

或者,如果您对awk点之后的两位数感到满意,则可以更简单,更易读:

 awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.