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

如何调整PromQL查询以准确获取Kubernetes节点平均CPU使用率

问题分析与修复方案

原查询的问题

你的PromQL查询存在两个关键错误,导致计算出的CPU使用率和实际值不符:

  • 标签匹配语法错误:mode!="idle|wait|iowait" 无法正确排除多个mode值。PromQL中!=仅支持单个值匹配,多值正则匹配需要使用!~运算符。原写法相当于匹配mode等于字符串"idle|wait|iowait"的反向,这几乎没有排除任何数据,导致计算逻辑完全错误。
  • 计算逻辑错误:avg by (instance) (rate(...))是对每个非空闲mode的CPU使用率取平均值,而非计算节点整体的CPU使用率占比。实际CPU使用率应该是所有非空闲CPU时间总和占总CPU时间的比例。

调整后的正确查询

以下两种查询均可得到和kubectl top nodes、Azure门户对齐的节点CPU使用率:

方案1:通过排除空闲类时间计算

100 * (sum by (instance) (rate(node_cpu_seconds_total{mode!~"idle|iowait"}[5m])) / sum by (instance) (rate(node_cpu_seconds_total[5m]))) > 80
  • 逻辑说明:
    1. sum by (instance) (rate(node_cpu_seconds_total{mode!~"idle|iowait"}[5m])):求和节点所有CPU核心的非空闲(排除idle、iowait)CPU时间的每秒变化率
    2. sum by (instance) (rate(node_cpu_seconds_total[5m])):求和节点所有CPU核心的总CPU时间每秒变化率(所有mode的总和)
    3. 两者相除后乘100得到百分比使用率,再设置>80的警报阈值

方案2:通过空闲时间反向计算

100 - (sum by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
  • 逻辑说明:用100%减去节点所有核心的空闲CPU时间占比,得到实际使用率,和主流工具的计算逻辑一致。

验证方法

调整查询后,可通过Prometheus UI对比查询结果和kubectl top nodes的输出,确认数值对齐后再更新警报规则。

内容的提问来源于stack exchange,提问作者Jananath Banuka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 19:44:56