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

Prometheus Node-Exporter单CPU总CPU时间占比超100%问题咨询

问题原因与解决办法

为什么单个CPU的各mode使用率总和会超过100%?

你遇到的现象核心和PromQL的rate计算逻辑、监控样本的采集特性有关,具体原因有这几点:

  • 样本时间戳的微小偏差:node_exporter采集CPU各mode的指标时,不是绝对瞬时完成的——采集完idle模式的数据,再采集softirq时,已经过去了几微秒,导致两个mode的样本时间戳有细微差异。rate是基于每个时间序列自身的样本窗口计算速率,这些时间戳偏差会让不同mode的速率计算基于略有不同的时间跨度,最终总和出现偏差。
  • rate的窗口插值误差:如果1m窗口的起始/结束点刚好不在样本采集点上,Prometheus会通过插值计算边界值。不同mode的插值逻辑会引入微小误差,叠加后就让总和偏离了100%。
  • 内核统计的精度限制:Linux内核统计CPU时间是按时间片累加的,极短的调度切换事件(比如中断触发后立刻回到idle)可能被两个mode重复统计,不过这个影响通常远小于前两者。

解决办法

针对你的完美主义需求,可以尝试这些方案:

  • 改用irate替代rate:irate是基于窗口内最后两个样本计算瞬时速率,时间跨度极小,样本偏差的影响几乎可以忽略,单个CPU的各mode总和会非常接近100%。缺点是irate对短期波动更敏感,适合展示瞬时使用率,不适合长期趋势。
  • 调整rate的窗口大小:把窗口设置为采集间隔的2倍(比如你的采集间隔是15s,就用[30s]),这样窗口内至少包含两个完整的样本周期,边界插值的误差会大幅降低。
  • 强制归一化修正:先计算单个CPU的总使用率,再让每个mode的使用率除以总使用率,确保总和为100%。示例表达式:
    rate(node_cpu_seconds_total{instance="...", cpu="10"}[1m])
    /
    sum(rate(node_cpu_seconds_total{instance="...", cpu="10"}[1m]))
    
    这个方法是强行修正数值,适合需要严格100%展示的场景,但会掩盖微小的统计误差。
  • 稳定采集间隔:确保Prometheus的scrape_interval和scrape_timeout配置稳定,避免node_exporter的采集时间波动过大,减少样本时间戳的偏差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 06:06:23