--cpus参数最简单有效,如docker run --cpus=0.5 nginx限制容器最多使用半个逻辑cpu核心;--cpu-shares控制争抢时的权重比例;--cpuset-cpus绑定特定cpu核心;验证需用docker stats和cgroup文件检查。

直接用 --cpus 参数最简单有效,比如 docker run --cpus=0.5 nginx 就限制容器最多使用半个逻辑 CPU 核心(即 50% 的单核时间),底层自动配置 CFS 配额,无需手动算周期和配额。
CPU 使用率上限:用 --cpus 最直观
这是生产环境首选方式,数值支持小数,单位是“逻辑核心数”:
-
--cpus=1→ 最多用满 1 个逻辑核(例如在 4 核 8 线程机器上,最多占 12.5% 总算力) -
--cpus=0.5→ 每 100ms 周期内最多运行 50ms,等效于 50% 单核利用率 -
--cpus=2.3→ 最高可用 2.3 个逻辑核心的计算时间,精度保留一位小数(2.35 会被截为 2.3)
它对应 cgroup v2 的 cpu.max 或 v1 的 cpu.cfs_quota_us/cpu.cfs_period_us,Docker 自动处理比例,不用自己算。
CPU 权重分配:用 --cpu-shares 控制争抢时的比例
这个参数不设硬上限,只在多个容器同时抢 CPU 时起作用:
- 默认值是 1024;设为
--cpu-shares=512表示权重减半 - 两个容器分别设 512 和 1024,CPU 时间按 1:2 分配(空闲时不生效)
- 适合资源弹性调度场景,但不能防止某个容器突发打满 CPU
绑定特定核心:用 --cpuset-cpus 提升隔离性
当需要 NUMA 亲和、避免跨核调度开销,或做严格隔离时使用:
-
--cpuset-cpus="0-2"→ 容器进程只能运行在物理核心 0、1、2 上 -
--cpuset-cpus="0,3"→ 只能跑在核心 0 和核心 3(跳过中间) - 常与
--cpus组合使用,比如--cpus=1 --cpuset-cpus="0"表示“只用核心 0,且最多占满它”
验证是否真的生效
别只看 top 里的百分比——它显示的是单核利用率,容易误判:
- 运行
docker stats,看 CPUs 列(已分配上限)和 MEM % / CPU % 列(当前使用占比) - 进容器执行
cat /sys/fs/cgroup/cpu.max(cgroup v2)或cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us(v1),确认数值匹配预期 - 查
/sys/fs/cgroup/cpu.stat中的nr_throttled,非零说明已被内核节流,限制正在起作用











