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

Ist*_*van 12 linux cpu-usage

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

# head -1 /proc/stat
cpu  67891300 39035 6949171 2849641614 118251644 365498 2341854 0
Run Code Online (Sandbox Code Playgroud)

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

  • 用户:在用户模式下执行的正常进程
  • nice:在用户模式下执行的 niced 进程
  • system:在内核模式下执行的进程
  • 空闲:摆弄拇指
  • iowait:等待 I/O 完成
  • irq:服务中断
  • 软中断:服务软中断
  • 偷窃:非自愿等待
  • 来宾:运行普通来宾
  • guest_nice:运行一个好的客人

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

Mat*_*Ife 11

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

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

如果你想要一个超过 5 秒的速率,你会读一次文件,休眠 5 秒,再读一次,得到计算的差异并除以 5。


Bar*_*cki 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.
Run Code Online (Sandbox Code Playgroud)

将数据放入 rrd 数据库后,您可以绘制图形,天空是极限:) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html