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

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

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

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

我正在考虑总结除 IOWait 之外的列(我在某处读到它被计入空闲状态),这样可以给我 100%,并且每个单独的列都可以通过 (column/100_percent) * 100 转换为百分比。

  • 用户:在用户模式下执行的正常进程
  • nice:在用户模式下执行的 niced 进程
  • 系统:在内核模式下执行的进程
  • 闲着:无所事事
  • iowait:等待 I/O 完成
  • irq:服务中断
  • softirq:服务软中断
  • steal:非自愿的等待
  • guest:运行普通客人
  • guest_nice: 运行一个 niced 的客人

这是一个可行的方法吗?或者我完全偏离了轨道?

答案1

您走的路是对的,top使用此文件来实现此目的。但您需要多次阅读它。

利用率是衡量一段时间内使用情况的指标。只要您知道主机的正常运行时间(以秒为单位),就可以读取一次,然后除以该值,但这样就可以得到自机器启动以来主机的利用率。

如果您想要 5 秒以上的速率,您可以读取文件一次,休眠 5 秒,然后再次读取,获取计算差值并除以 5。

答案2

你的方法是正确的。你可以使用 /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

答案3

如果你想要一行代码,它可能看起来像这样:

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- 第5个字段,根据man prochttp://www.linuxhowtos.org/System/procstat.htm

如果这对您不起作用,请告诉我。

答案4

或者,如果您对小数点后只有两位数字感到满意,awk 可以做得更简单、更易读:

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

相关内容