如何在Prometheus中编写正确的1分钟CPU负载平均值查询?
正确的Prometheus CPU负载百分比查询写法
问题根源分析
你原Grafana查询在Prometheus中无结果,是因为嵌套的count(count(node_cpu_seconds_total...) by (cpu))写法逻辑错误:
- 内层
count(node_cpu_seconds_total) by (cpu)会为每个CPU核心输出一条值(每个cpu标签对应1条结果) - 外层直接用
count()会尝试统计这些结果的数量,但没有指定与avg(node_load1)匹配的维度(instance、job),导致维度对齐失败,返回空结果。
而你尝试的第二个查询结果有差异,是因为用count by (instance, job) (node_cpu_seconds_total{mode="idle"})统计核心数的方式不可靠——如果某个CPU核心的idle指标采集异常,计数会偏小,最终计算出的负载百分比会偏高。
正确查询写法
要准确计算1分钟系统负载相对于CPU核心数的百分比,正确逻辑是:
- 获取目标实例的1分钟负载:
node_load1{instance="$node", job="$job"} - 准确统计目标实例的CPU核心总数:通过
without(mode)去掉node_cpu_seconds_total的mode维度(每个CPU核心会对应多个mode的指标),再按instance和job维度计数,得到核心数。
基础查询(输出百分比)
(node_load1{instance="$node", job="$job"} / count by (instance, job) (node_cpu_seconds_total{instance="$node", job="$job"} without(mode))) * 100
过滤百分比≥95的情况
(node_load1{instance="$node", job="$job"} / count by (instance, job) (node_cpu_seconds_total{instance="$node", job="$job"} without(mode))) * 100 >= 95
补充说明
如果你不需要按instance和job维度保留标签,也可以用count without(cpu, mode) (node_cpu_seconds_total{instance="$node", job="$job"})来获取核心数,效果一致:
(node_load1{instance="$node", job="$job"} / count without(cpu, mode) (node_cpu_seconds_total{instance="$node", job="$job"})) * 100
内容的提问来源于stack exchange,提问作者Astrid
相关产品推荐
相关产品推荐

