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)
100*sum(increase(node_cpu_seconds_total{mode="irq"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total[1m])) by(instance)
100*sum(increase(node_cpu_seconds_total{mode="nice"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total[1m])) by(instance)
100*sum(increase(node_cpu_seconds_total{mode="softirq"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total[1m])) by(instance)
100*sum(increase(node_cpu_seconds_total{mode="steal"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total[1m])) by(instance)
100*sum(increase(node_cpu_seconds_total{mode="system"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total[1m])) by(instance)
100*sum(increase(node_cpu_seconds_total{mode="user"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total[1m])) by(instance)
100*sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total[1m])) by(instance)