2、CPU管理策略基础:Linux CFS调度器原理与Kubernetes CPU请求/限制模型
在Kubernetes集群中,CPU资源的分配与隔离直接决定Pod的响应延迟与吞吐能力。要理解CPU管理策略,必须首先掌握底层Linux完全公平调度器(CFS)的工作机制,以及Kubernetes如何通过requests和limits模型将CFS的能力暴露给容器编排层。
2.1 Linux CFS调度器核心原理
CFS(Completely Fair Scheduler)是Linux内核默认的CPU调度器,其设计哲学是“让每个进程尽可能公平地获得CPU时间”。CFS不依赖固定时间片,而是引入虚拟运行时间(vruntime)作为调度决策的核心指标。
CFS使用红黑树(Red-Black Tree)组织所有可运行进程,以vruntime为键值。调度器每次选择树中最左侧节点(vruntime最小)的进程运行,确保所有进程在宏观上获得公平的CPU份额。
2.2 CFS调度周期与CPU时间分配
CFS以调度周期(sched_latency)为单位进行CPU时间分配。默认调度周期为48ms,当可运行进程数量超过一定阈值时,周期会按比例扩展。每个进程在一个周期内至少获得一次运行机会。
| 参数 | 默认值 | 说明 |
|---|---|---|
| sched_latency_ns | 48,000,000 (48ms) | 调度周期,所有进程在一个周期内至少运行一次 |
| min_granularity_ns | 4,000,000 (4ms) | 进程最小运行时间,防止上下文切换过于频繁 |
| nr_running | 动态 | 当前可运行进程数量,影响调度周期扩展 |
sched_latency = 48ms × (nr_running / 8) 扩展调度周期,确保每个进程至少获得4ms的运行时间。
2.3 Kubernetes CPU请求与限制模型
Kubernetes通过requests和limits两个参数控制Pod的CPU资源使用。这两个参数直接映射到CFS的权重(weight)和带宽限制(cfs_quota)机制。
2.3.1 CPU Requests:权重分配
requests定义了Pod启动时保证的CPU份额。Kubelet将requests值转换为CFS权重,权重计算公式为:
# 权重计算逻辑(简化)
weight = (requests_in_milli_cores / 1000) * 1024
# 示例:requests=500m(0.5核)
weight = (500 / 1000) * 1024 = 512
权重决定了Pod在CPU竞争时的相对优先级。当多个Pod争用CPU时,CFS按权重比例分配时间片。
2.3.2 CPU Limits:带宽上限
limits定义了Pod可以使用的CPU上限。Kubelet通过CFS的cfs_period_us和cfs_quota_us实现带宽限制:
# CFS带宽限制参数
cfs_period_us = 100000 # 100ms,固定值
cfs_quota_us = limits_in_milli_cores * 100 # 例如limits=1000m,quota=100000us
# 示例:limits=2000m(2核)
cfs_quota_us = 2000 * 100 = 200000us
在每100ms的周期内,Pod最多运行cfs_quota_us微秒。如果Pod在该周期内用完配额,将被CFS节流(throttled),直到下一个周期才能继续运行。
2.4 CPU请求与限制的三种配置模式
| 配置模式 | requests | limits | CFS行为 | 适用场景 |
|---|---|---|---|---|
| Burstable(可突发) | 设置 | 设置(>requests) | 保证基础份额,允许突发到上限 | Web服务、API网关 |
| Guaranteed(保证) | 设置 | 设置(=requests) | 严格保证,无突发能力 | 数据库、关键业务 |
| BestEffort(尽力) | 未设置 | 未设置 | 无保证,使用空闲资源 | 批处理、离线任务 |
2.5 CPU节流(Throttling)与性能影响
当Pod的CPU使用率接近limits时,CFS会触发节流机制。节流会导致Pod暂停执行,直到下一个CFS周期开始。频繁的节流会显著增加Pod的响应延迟。
通过以下指标可以监控CPU节流情况:
- container_cpu_cfs_throttled_seconds_total:容器被节流的总时间
- container_cpu_cfs_throttled_periods_total:容器被节流的周期数
- throttled_ratio:节流周期占总周期的比例,超过5%需要关注
# 使用PromQL查询CPU节流比例
rate(container_cpu_cfs_throttled_seconds_total[5m]) /
rate(container_cpu_cfs_periods_total[5m])