已设置CPU请求与限制为1000m,Pod CPU使用率为何超100%?
为何Pod的CPU使用率会超过100%?
以下是几种常见原因,结合你的配置逐一分析:
1. PromQL统计了Pod内所有容器的CPU使用总和
你的查询语句使用sum_irate对Pod下所有非空容器的CPU使用率求和:
node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace="$namespace", pod=~"$PodPrefix-.*", container!=""}
如果你的Pod包含多个容器(比如业务容器+日志采集/监控sidecar),且每个容器都在Deployment中配置了1000m的CPU限制,那么Pod整体的CPU使用率就是所有容器的总和。例如2个容器各用100%,总和就是200%,这完全符合预期。
2. CPU限制是平均时间配额,而非瞬时使用率硬限制
Kubernetes的CPU限制(1000m)基于CFS调度器的CPU时间配额:它允许Pod在每个调度周期内使用最多1000m对应的CPU时间(即每秒1个核心的1秒时间),但不限制瞬时的并行使用。
如果节点是多核心机器,Pod内的进程可以同时在多个核心上运行,导致瞬时CPU使用率超过100%。比如1秒内进程在两个核心上各运行0.7秒,总使用时间是1.4秒,对应瞬时使用率140%。但从长期(如1分钟)来看,CPU使用的平均速率会被限制在1000m以内。
3. 指标计算的是瞬时速率,而非平均速率
irate函数计算的是瞬时速率,它取最近两个数据点的差值计算当前CPU使用速率,对短时间内的波动非常敏感。如果应用有突发CPU峰值,irate会直接反映这个峰值,导致显示的使用率超过限制。
若想查看符合Kubernetes限制逻辑的平均使用率,可改用rate函数(基于更长时间窗口计算平均速率),示例:
node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace="$namespace", pod=~"$PodPrefix-.*", container!=""}[5m]
4. 未排除pause容器(可能性较低)
部分环境中,Pod的pause容器会被标记为container="POD",如果查询未排除这个容器,虽其CPU占用极低,但极端情况下可能让总和略超100%。可修改查询语句明确排除:
node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace="$namespace", pod=~"$PodPrefix-.*", container!="", container!="POD"}
内容的提问来源于stack exchange,提问作者milkcoke
相关产品推荐
相关产品推荐

