--cpus参数是最可靠、最易用的CPU硬限制方式,以逻辑核心为单位设绝对上限,底层通过cgroups的cpu.cfs_quota_us和cpu.cfs_period_us实现,支持小数(如--cpus=0.8),不受宿主机核心数变化影响,且不依赖CPU争抢场景。

直接用 --cpus 参数,是最可靠、最易用的方式。它不是“百分比”概念,而是以逻辑 CPU 核心为单位的硬性上限,效果等同于限制 CPU 使用率百分比,且不受宿主机核心数变化干扰。
用 --cpus 设置绝对 CPU 上限(推荐)
这是生产环境首选方式,底层通过 cgroups 的 cpu.cfs_quota_us 和 cpu.cfs_period_us 实现硬限制,不依赖 CPU 争抢,也不受其他容器影响。
- 设为
--cpus=0.8:容器最多使用 0.8 个逻辑核心,相当于单核机器上 80% 的 CPU 时间,四核机器上仍是固定 0.8 核——不会因宿主机核数变多而突破配额 - 等价于手动设置:
--cpu-period=100000 --cpu-quota=80000(周期 100ms,配额 80ms) - 支持小数,精度到 0.01,适合精细化控制,比如 API 网关限 1.2 核、日志采集限 0.3 核
避免只用 --cpu-shares 做“限制”
--cpu-shares 是权重值(默认 1024),仅在多个容器同时争抢 CPU 时起作用,属于软性调度偏好,完全不限制单容器的峰值占用。即使设为 100,只要没其他容器竞争,它仍可吃满全部 CPU。
- 举例:一台 4 核服务器只跑一个
--cpu-shares=100的容器,它会毫无阻碍地占满 400% CPU(即 4 核) - 它适合做“相对公平分配”,比如后台任务让出资源给前端服务,但不能防 DDoS 或程序失控导致的算力蚕食
必要时绑定具体 CPU 核心(--cpuset-cpus)
当需要彻底隔离干扰(如实时业务、高敏感中间件),可配合 --cpuset-cpus 将容器固定到特定物理核心,避免跨核调度开销和缓存污染。
- 例如:
--cpus=1 --cpuset-cpus="0"表示只允许使用第 0 号 CPU 核,且最多用满该核 - 注意:需确认宿主机 CPU topology(用
lscpu查看),避免绑到超线程伪核或被系统关键进程共用的核心
验证是否生效
启动后立刻检查 cgroups 配置,确认硬限制已写入:
- 查容器 ID:
docker ps -qf name=your-container - 进对应 cgroup 目录:
cat /sys/fs/cgroup/cpu/docker/<container-id>/cpu.cfs_quota_us(应为正整数,如 80000) - 对比:
cat /sys/fs/cgroup/cpu/docker/<container-id>/cpu.cfs_period_us(通常为 100000) - 运行中观察:
docker stats your-container中 CPU % 值不会持续突破设定上限(瞬时毛刺除外)


















