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区分

posted @ 2021-11-25 18:19  道霖  阅读(5956)  评论(1编辑  收藏  举报