Docker中CPU精细化流控需配合使用--cpu-period和--cpu-quota:前者设调度周期(默认100000μs),后者设周期内最大CPU时间,实际使用率=quota÷period;周期越小(≥1000μs)流控越灵敏,但须避免与--cpus参数混用。

在 Docker 中配置 CpuPeriod 实现精细化 CPU 流控,本质是通过 Linux CFS(完全公平调度器)的周期配额机制,控制容器每单位时间能使用的 CPU 时间上限。它不单独生效,必须和 CpuQuota 配合使用。
CpuPeriod 和 CpuQuota 的关系要搞清
这两个参数共同定义了一个“带宽限制”:
- --cpu-period:调度周期长度,单位微秒(μs),默认是 100000(即 100ms)
- --cpu-quota:该周期内允许使用的最大 CPU 时间,单位也是微秒;设为 -1 表示不限制
实际 CPU 使用率 = CpuQuota ÷ CpuPeriod。例如:
–cpu-period=100000 –cpu-quota=30000 → 30% 单核 CPU;
–cpu-period=50000 –cpu-quota=25000 → 同样是 50%,但调度粒度更细、响应更灵敏。
什么时候需要调小 CpuPeriod
默认 100ms 周期对多数场景够用,但以下情况建议缩短周期(如设为 50000 或 25000):
- 容器有短时突发负载(如毫秒级请求处理),希望更及时地节流,避免单次超用后被长时间压制
- 多个高优先级服务共存,需更平滑的 CPU 时间分配,减少抖动
- 做性能压测或流控验证,需观察更精细的时间片行为
配置方式与验证步骤
启动容器时直接指定:
docker run -d \ --name cpu-limited-app \ --cpu-period=50000 \ --cpu-quota=15000 \ nginx:alpine
这表示:每 50ms 周期最多运行 15ms,等效于 30% 单核 CPU,但比用 100ms 周期更紧凑。
验证是否生效:
- 查容器 ID:
docker ps -q --filter name=cpu-limited-app - 检查 cgroup 设置:
cat /sys/fs/cgroup/cpu/docker/<container-id>/cpu.cfs_period_us和cpu.cfs_quota_us - 输出应分别为 50000 和 15000
注意事项
这些细节容易踩坑:
- CpuPeriod 最小不能低于 1000(1ms),否则内核会报错:“period must be greater than or equal to 1000”
- CpuQuota 可以为负数(-1)表示不限,但 CpuPeriod 必须为正整数
- 使用
--cpus=0.3这类高层参数时,Docker 会自动换算成默认 period+quota,无法自定义 period;如需精细流控,必须显式用--cpu-period和--cpu-quota - 该设置只影响 CPU 时间片分配,不改变进程优先级(nice 值)或实时性


















