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


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

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

我正在考虑总结除IOWait之外的列(我正在读取它在空闲时计算的某个地方)并且这将给我100%,每个单独的列可以转换为百分比(列/ 100_percent)* 100。

  • user:在用户模式下执行的正常进程
  • nice:在用户模式下执行的niced进程
  • system:在内核模式下执行的进程
  • 闲置:大拇指
  • iowait:等待I / O完成
  • irq:服务中断
  • softirq:服务softirqs
  • 窃取:非自愿等待
  • 客人:正常客人
  • guest_nice:运行一个niced guest

这是一种可行的方法,还是完全偏离轨道?


12
2018-01-04 00:52






答案:


你走在正确的轨道上, top 为此目的使用此文件。但是你需要不止一次地阅读它。

利用率是一种随时间推移使用的衡量标准。如果您知道主机的正常运行时间(以秒为单位),则可以读取它,然后除以该值,但这将为您提供自机器启动以来主机的实用率。

如果您想要超过5秒的速率,您将读取文件一次,睡眠5秒,再次读取,获得计算的差异并除以5。


11
2018-01-04 00:59





你的方法是正确的。您可以使用/ proc / stat作为原始数据并使用它来输入rrdtool。 我已经完成了这样的事情,所以我100%知道它是可能的。 您可以很好地分别绘制整个系统负载或每个核心的图形。

这是我自己的一个工作示例: enter image description here

谦虚 - >你可以做到,基础数学并不难,我的图表就是一个现实的例子。 为了收集数据,我将/ 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 


6
2018-01-07 01:08



你如何解析数据? - ewwhite
@ewwhite - >我编辑了我的答案,以展示我如何解析数据。 - Bartłomiej Zarzecki
漂亮的图表!关于您缺少的列注释: askubuntu.com/a/120961/451886。如果它在VM中运行,也许它就是“窃取”计数器。 - rkagerer


如果你想oneliner它可能看起来像这样:

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 proc 和 http://www.linuxhowtos.org/System/procstat.htm

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


4
2018-01-06 17:15





或者,如果你对awk之后的两位数字感到满意,那么它可以更简单,更易读:

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

0
2017-07-27 01:05