You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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. 获取目标实例的1分钟负载:node_load1{instance="$node", job="$job"}
  2. 准确统计目标实例的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 10:05:22