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

Prometheus查询容器CPU使用率无结果问题排查求助

问题排查与修复建议

一、代码层面的核心问题

  1. CPU配额计算逻辑完全错误
    你代码里的分母sum(container_spec_cpu_quota{{{constraint}}}/({duration}*1000)) by (container, pod)完全不符合Kubernetes CPU配额的计算规则。Kubernetes中,容器CPU配额的正确核数计算是container_spec_cpu_quota / container_spec_cpu_period——container_spec_cpu_quota是微秒数,container_spec_cpu_period默认是100000微秒(100ms),两者相除才是该容器能使用的CPU核数上限。你用duration*1000作为除数,会导致分母被放大N倍,最终计算出的使用率趋近于0,这是导致绝大多数Pod显示0使用率的主要原因。

  2. irate时间窗口与查询参数不匹配
    你用压测的duration作为irate的时间窗口,同时设置query_range的step为1秒:

  • 如果duration远大于Prometheus的采集间隔(比如默认15秒),irate会取窗口内最后两个样本计算速率,但若查询时间范围包含压测结束后的时间段,窗口内的CPU使用率可能已经没有变化,返回0。
  • irate要求窗口内至少有2个样本才能计算有效速率,若duration小于采集间隔,窗口内只有1个样本,直接返回0。
  1. 时间边界与等待时间不足
    你设置endtime = starttime + duration,但Prometheus采集样本需要时间,仅sleep(1)可能导致压测结束后的最后几个样本还未写入存储,查询时边界处的窗口没有足够样本,irate返回0。

二、Prometheus配置/指标层面的可能问题

  1. 采集间隔与irate窗口不匹配
    若Prometheus采集container_cpu_usage_seconds_total的间隔是15秒,而你设置的irate窗口小于30秒(2倍采集间隔),会出现窗口内样本不足的情况,无法计算有效速率,返回0。

  2. 指标缺失
    部分Pod可能未配置CPU配额,导致container_spec_cpu_quota指标不存在,此时sum后该Pod的分母为空,计算结果为NaN,但你说显示0,所以这个可能性较低,但仍需验证。

具体修复步骤

  1. 修正CPU配额计算逻辑
    替换错误的PromQL,使用正确的CPU配额计算方式:
sum(irate(container_cpu_usage_seconds_total{{{constraint}}}[30s])) by (container, pod) 
/ 
sum(container_spec_cpu_quota{{{constraint}}}/container_spec_cpu_period{{{constraint}}}) by (container, pod) 
* 100

若部分Pod未配置CPU配额,可降级使用CPU请求值作为分母:

sum(irate(container_cpu_usage_seconds_total{{{constraint}}}[30s])) by (container, pod) 
/ 
(
  sum(container_spec_cpu_quota{{{constraint}}}/container_spec_cpu_period{{{constraint}}}) by (container, pod) 
  or on(container,pod) group_left sum(kube_pod_container_resource_requests_cpu_cores{{{constraint}}}) by (container,pod)
)
* 100
  1. 调整irate窗口与查询参数
  • irate窗口固定设为2倍Prometheus采集间隔(比如默认15秒采集间隔,窗口设30秒),不要用压测时长作为窗口,保证窗口内至少有2个样本。
  • query_range的step设置为与采集间隔一致(比如15秒),减少无效计算。
  • 查询时间范围调整为starttime - 30s到endtime + 30s,覆盖压测前后的样本,避免边界问题。
  1. 增加等待时间
    将sleep(1)改为sleep(5)或更长,给Prometheus足够时间完成压测后的样本写入。

  2. 验证指标存在性
    在Prometheus UI中单独查询container_cpu_usage_seconds_total{{namespace="你的命名空间"}}和container_spec_cpu_quota{{namespace="你的命名空间"}},确认所有目标Pod都有对应样本。

总结

核心问题是代码中CPU配额的计算逻辑错误,导致使用率被错误计算为0;其次是irate窗口设置不合理引发的样本不足问题。先修正PromQL的分母计算,再调整查询参数,基本就能解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:24:56