CPU是我们系统最重要的指标之一,它主要提供系统计算功能,所有CPU的状态能够反映了系统的健康状态,CPU是监控必不可少的指标之一。
CPU概念
user time:cpu执行用户进程消耗的时间
system time:cpu在内核运行的时间
io wait:cpu在等待I/O操作完成的时间
idle time:系统处于空闲的时间
nice time:系统调整进程优先级的时间
lrq time:系统处理赢中断花费的时间
softlrq time:系统处理软中断花费的时间
steal time:被强制等待虚拟cpu时间
监控CPU使用率
在上面8个CPU时间中,除了idle time反映的是CPU空闲时间,其余7个都包含在CPU使用时间里面,也就是CPU使用率=100*(1-idle time/CPU时间)
在之前我们已经部署了prometheus和node_exporter了,node_exporter需要部署在被监控端。
我们先查询 node_cpu_seconds_total ,这个可以统计cpu时间,因为是2核的,所以可以看到labels里面是有cpu=”0”和cpu=”1”标签的,我们这边也是计算总cpu的使用率,当然也可以根据自己具体的需要,计算单个cpu的使用率。
我们查询出空闲时间 node_cpu_seconds_total{mode=”idle”}
上图,这个value的值反映的是截至目前为止,cpu空闲时间的和,我们必须要统计最近cpu的状态,统计cpu idle time最近1分钟的时间 increase(node_cpu_seconds_total{mode=”idle”}[1m])
上图,我们统计了cpu0和cpu1的idle time 最近一分钟的时间
我们需要计算他们的和,sum(increase(node_cpu_seconds_total{mode=”idle”}[1m]))
但是,其实还有一个注意的点,我们来看下面这张图片,这张图片是还没有使用sum计算和的输出,sum函数会把我们这边的输出项都累加计算求和,因为我们现在至少监控一台机器,所以instance都是一样的,也就是都是一台机器,如果监控了很多机器,这边会输出很多机器的cpu最近一分钟的idle time,如果这样,就会导致把所有机器idle time求和了,我们需要使用 by 根据instance来求和
sum(increase(node_cpu_seconds_total{mode=”idle”}[1m])) by(instance)
下面我们计算所有cpu时间,node_cpu_seconds_total 反映了所有cpu时间
我们计算最近1分钟所有cpu time,increase(node_cpu_seconds_total[1m])
在根据instance求和,sum(increase(node_cpu_seconds_total[1m])) by(instance)
最后我们组合2个公式得到CPU使用率 100*(1-sum(increase(node_cpu_seconds_total{mode=”idle”}[1m])) by(instance) / sum(increase(node_cpu_seconds_total[1m])) by(instance))
同理其他cpu time也是差不多算法
100*sum(increase(node_cpu_seconds_total{mode="iowait"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total[1m])) by(instance) |