容器 CPU 使用率计算:配额、单位与 PromQL 详解
一、核心公式:使用率 =(实际使用量 / 分配配额)× 100%
表达式的本质是计算:
CPU使用率 = (实际CPU使用速率 / 分配的CPU配额) × 100%
对应到 PromQL 中,就是:
(rate(实际使用指标[5m]) / (配额指标 / 周期指标)) * 100
其核心是通过「实际使用量与分配配额的比值」来反映容器对 CPU 资源的利用效率。
二、公式的底层逻辑:映射 Linux 的 CPU 调度机制
Kubernetes 容器的 CPU 管理直接依赖 Linux 内核的 CFS(Completely Fair Scheduler,完全公平调度器),而公式中的指标正是对 CFS 核心参数的直接映射:
- rate(container_cpu_usage_seconds_total[5m]):计算容器的实际 CPU 使用速率
container_cpu_usage_seconds_total 是一个单调递增的计数器,记录容器从启动到当前累计使用的 CPU 时间(单位:秒)。
rate(..., [5m]) 用于计算该计数器在 5 分钟内的平均增长率(单位:秒/秒),即容器每秒实际使用的 CPU 核心数。 例如:rate(...) = 0.5 表示容器平均每秒使用 0.5 个 CPU 核心(500m或者0.5c或者50ms)。
核心数和事件的换算
1c=1000m=100ms - (container_spec_cpu_quota / container_spec_cpu_period):计算容器的 CPU 配额(分配的核心数)
根据 CFS 调度规则,容器的 CPU 配额(允许使用的最大核心数)计算公式为:
配额核心数 = 配额时间(quota) / 调度周期(period)
若容器的 CPU 限制为 1c(1 核心),则: quota = 100000 微秒(100ms),period = 100000 微秒(100ms), 因此 quota/period = 100000/100000 = 1(即 1 核心)。
若限制为 500m(0.5 核心),则: quota = 50000 微秒(50ms),period = 100000 微秒, 因此 quota/period = 50000/100000 = 0.5(即 0.5 核心)。 - 整体公式:计算使用率百分比
使用率 = (实际使用速率 / 配额核心数) × 100%
分子是容器实际消耗的 CPU 资源速率(如 0.5 核心/秒)。
分母是容器最多能使用的 CPU 资源(如 1 核心)。
结果乘以 100 转换为百分比(如 (0.5 / 1) × 100 = 50%)。
三、为什么这样设计?
贴合 Linux 内核的实际调度逻辑 Kubernetes 容器的 CPU 限制本质是通过 CFS 的 quota 和 period 实现的,公式直接复用这两个参数计算配额,确保结果与内核调度行为一致。
反映资源的实际利用效率 使用率不仅关注“用了多少”,更关注“用了分配量的百分之多少”。
例如: 同样使用 0.5 核心,对配额 1 核心的容器是 50% 使用率,对配额 0.5 核心的容器是 100% 使用率(已达上限),后者更可能出现资源瓶颈。平滑短期波动 使用 rate(..., [5m]) 而非瞬时值,是为了过滤短时间的 CPU 突发(如瞬时峰值),更准确反映容器的长期使用趋势。
四、示例:配额 2 核心的容器
假设某容器的 CPU 限制为 2c(2 核心),则:
container_spec_cpu_quota = 200000 微秒(200ms),container_spec_cpu_period = 100000 微秒(100ms),因此 quota/period = 2(2 核心)。
若 rate(container_cpu_usage_seconds_total[5m]) = 1.2(每秒使用 1.2 核心),则使用率为 (1.2 / 2) × 100 = 60%。
总结
该公式的核心是将容器的实际 CPU 消耗与分配的配额进行对比,本质上是对 Linux 内核 CFS 调度参数的直接计算,既符合底层操作系统的资源管理逻辑,又能直观反映容器对分配资源的利用效率,是 Kubernetes 中监控容器 CPU 负载的标准方式。
PRometheus 的 Pod 维度监控公式
1 Pod CPU使用占request百分比
(
sum by (pod, namespace,cluster) (
rate(container_cpu_usage_seconds_total{container!="", container!="POD",container=~".*",cluster=~"prod"}[5m])
)
)
/
on(cluster,pod, namespace)
(
sum by (cluster,pod, namespace) (
kube_pod_container_resource_requests{resource="cpu"}
)
)
* 100
2 Pod CPU使用占limit百分比
(
sum by (pod, namespace,cluster) (
rate(container_cpu_usage_seconds_total{container!="", container!="POD",container=~".*",cluster=~"prod"}[5m])
)
)
/
on(cluster,pod, namespace)
(
sum by (cluster,pod, namespace) (
kube_pod_container_resource_limits{resource="cpu"}
)
)
* 100
3 Pod MEM使用占limit百分比
(
sum by (pod, namespace,cluster,container) (
container_memory_working_set_bytes{container!="", container!="POD",container=~"^$container.*",cluster=~"$cluster"}
)
)
/
on(cluster,pod, namespace,container)
(
sum by (cluster,pod, namespace,container) (
kube_pod_container_resource_limits{resource="memory",cluster="prod",cluster=~"$cluster"}
)
)
* 100
评论区