Prometheus 查询语言 PromQL 的 CPU 使用率计算方法
参考文档:https://blog.csdn.net/qq_35753140/article/details/105121525
--------------
cpu使用率
--------------
100 * (1 - sum by (instance)(increase(node_cpu_seconds_total{mode="idle"}[5m])) /
sum by (instance)(increase(node_cpu_seconds_total[5m])))
会将所有主机的CPU使用率显示在一个panel中
以下是对参考文档的一些备注说明:
增加increase函数,查看效果:
其实increase的作用是:用这12个数据点中的最后一个数据点1563.56减去第一个数据点1508.76,
即得到这个范围内的增量。
也就是上图中增加increase后的效果。
这里的数据只是做一个演示,主要是为了讲解原理和规则,不要去纠结数据的正确性。
回到计算CPU使用率的场景中来:
increase(node_cpu_seconds_total{cpu="0",mode="idle"}[5m])
node_cpu_seconds_total表示的是:系统自开机以来,cpu的总时间(单位秒)
{cpu="0"}表示的是:第一个CPU
{mode="idle"}表示的是:CPU的mode为idle
[5m]表示的是5分钟的区间
increase表示增量
13:00 系统启动
13:45 采集的数据为13000
13:50 采集的数据为13567 (现在)
[5m] 就表示 13:45 ~ 13:50
increase 就表示 13:45 ~ 13:50 之间的增量 即 567
cpu0 5分钟内处于空闲状态的时间占比
increase(node_cpu_seconds_total{cpu="0",mode="idle"}[5m]) /
increase(node_cpu_seconds_total{cpu="0"}[5m])
针对CPU0,在这5分钟内,处于idle状态的时间增量为 20秒(红色)
针对CPU0,在这5分钟内,总时间增量(user + sys + idle + irq + iowait + nice + softirq + steal) 为500秒(黑色)
则这5分钟内,百分比为 20 / 500 = 4%,即:处于空闲状态的时间占比为4%。
一个服务器可能有4颗CPU,上面计算了1个CPU的,现在我们计算所有CPU的(没有用cpu="0"这样的字眼来过滤):
sum(increase(node_cpu_seconds_total{mode="idle"}[5m])) / sum (increase(node_cpu_seconds_total[5m]))
increase(node_cpu_seconds_total{cpu="0", mode="idle"}[5m]) CPU0在这5分钟的增量 20
increase(node_cpu_seconds_total{cpu="1", mode="idle"}[5m]) CPU1在这5分钟的增量 30
increase(node_cpu_seconds_total{cpu="2", mode="idle"}[5m]) CPU2在这5分钟的增量 40
increase(node_cpu_seconds_total{cpu="3", mode="idle"}[5m]) CPU3在这5分钟的增量 70
sum()的作用就是计算总和 :20 + 30 + 40 + 70 = 160
即:所有CPU在这5分钟内,处于idle状态的总时间。
increase(node_cpu_seconds_total{cpu="0"}[5m]) CPU0在这5分钟的增量 1000
increase(node_cpu_seconds_total{cpu="1"}[5m]) CPU0在这5分钟的增量 1200
increase(node_cpu_seconds_total{cpu="2"}[5m]) CPU0在这5分钟的增量 1300
increase(node_cpu_seconds_total{cpu="3"}[5m]) CPU0在这5分钟的增量 1500
sum() 计算总和 1000 + 1200 + 1300 + 1500 = 5000
即:所有CPU在这5分钟内,总的时间增量。
即:160 / 5000 = 3.2% (0.032),这就是空闲率。
那么CPU使用率 = 1 - 空闲率 = 1 - 3.2% = 96.8%
以上就计算出了一台主机的CPU使用率。
==========================================================================
注意:假设我们在配置文件中只配置了一台主机,才能使用上面的计算方式。(比如下图)
如果你的配置文件中配置了多台主机,则上面的计算方式不对。(比如下图)
如果要监控多台主机,则需要注意用instance来区分。
increase(node_cpu_seconds_total{cpu="0", mode="idle", instance="localhost:8080"}[5m]) 1000 \
increase(node_cpu_seconds_total{cpu="1", mode="idle", instance="localhost:8080"}[5m]) 1200 |
increase(node_cpu_seconds_total{cpu="2", mode="idle", instance="localhost:8080"}[5m]) 1300 | 一组
increase(node_cpu_seconds_total{cpu="3", mode="idle", instance="localhost:8080"}[5m]) 1500 /
increase(node_cpu_seconds_total{cpu="0", mode="idle", instance="localhost:8081"}[5m]) 1000 \
increase(node_cpu_seconds_total{cpu="1", mode="idle", instance="localhost:8081"}[5m]) 1200 |
increase(node_cpu_seconds_total{cpu="2", mode="idle", instance="localhost:8081"}[5m]) 1300 | 一组
increase(node_cpu_seconds_total{cpu="3", mode="idle", instance="localhost:8081"}[5m]) 1500 /
sum by (instance) (increase(node_cpu_seconds_total{mode="idle"}[5m]))
按主机分组(即按instance)进行求和
上述表达式会得出2个值
increase(node_cpu_seconds_total{cpu="0", instance="localhost:8080"}[5m]) 5分钟的增量 1000
increase(node_cpu_seconds_total{cpu="1", instance="localhost:8080"}[5m]) 5分钟的增量 1200
increase(node_cpu_seconds_total{cpu="2", instance="localhost:8080"}[5m]) 5分钟的增量 1300
increase(node_cpu_seconds_total{cpu="3", instance="localhost:8080"}[5m]) 5分钟的增量 1500
increase(node_cpu_seconds_total{cpu="0", instance="localhost:8081"}[5m]) 5分钟的增量 1000
increase(node_cpu_seconds_total{cpu="1", instance="localhost:8081"}[5m]) 5分钟的增量 1200
increase(node_cpu_seconds_total{cpu="2", instance="localhost:8081"}[5m]) 5分钟的增量 1300
increase(node_cpu_seconds_total{cpu="3", instance="localhost:8081"}[5m]) 5分钟的增量 1500
sum by (instance) (increase(node_cpu_seconds_total[5m]))
按主机分组(即按instance)进行求和
上述表达式会得出2个值
sum by (instance)(increase(node_cpu_seconds_total{mode="idle"}[5m])) /
sum by (instance)(increase(node_cpu_seconds_total[5m]))
这也会得到2个值,用instance区分