docker容器资源权重分配核心是通过cgroups v2的cpu和内存子系统控制相对竞争关系:--cpu-shares设调度优先级(默认1024),--memory-weight设oom优先级(范围1–10000,默认100),需搭配软性限制如--cpu-quota和--memory使用,并确保宿主机启用cgroups v2。

在 Docker 中配置容器资源权重分配,核心是通过 cgroups v2 的 CPU 和内存子系统控制容器间的相对资源竞争关系,而非硬性限制。重点不是“分多少”,而是“优先级怎么排”——尤其适用于多容器共存、负载波动频繁的场景(比如微服务集群或 CI/构建节点)。
CPU 权重:用 --cpu-shares 控制调度优先级
--cpu-shares 设置的是相对权重值(默认 1024),决定当 CPU 资源紧张时,内核 CFS 调度器如何按比例分配 CPU 时间片。它不保证最低份额,也不限制上限,只在争抢时起作用。
- 两个容器分别设为
--cpu-shares=512和--cpu-shares=1536,理论 CPU 时间分配比约为 1:3(512:1536 = 1:3) - 若只有一个容器在跑,即使设为 1,它也能用满全部 CPU;只有多个容器同时高负载时,权重才生效
- 注意:该参数在 cgroups v1 下有效;Docker 默认启用 cgroups v2 后,仍兼容此参数,底层会映射为
cpu.weight
内存权重:cgroups v2 下用 --memory-weight
Docker 20.10+ 支持 cgroups v2 后,新增 --memory-weight 参数(范围 1–10000,默认 100),用于在内存压力下决定 OOM killer 杀进程的优先级顺序。
- 权重越高,越不容易被杀;权重低的容器在内存不足时更早被回收
- 例如:
docker run --memory-weight=800的容器比默认权重(100)的容器更抗 OOM - 需确保宿主机启用 cgroups v2(检查
cat /proc/sys/fs/cgroup/unified/hybrid应为 0,且stat /sys/fs/cgroup -c '%m'返回统一挂载点)
组合策略:权重 + 软性限制更实用
纯权重易受突发负载干扰,建议搭配软性边界使用:
- CPU:用
--cpu-quota+--cpu-period设最大可用时间(如每 100ms 最多用 50ms),再配合--cpu-shares做争抢分配 - 内存:用
--memory设硬上限防失控,再用--memory-weight调整 OOM 顺序;对缓存型服务(如 Redis)可适当提高 weight - 避免混用 v1/v2 参数:比如不要同时设
--memory-reservation(v1)和--memory-weight(v2),可能导致行为不可预期
验证与调优建议
运行后通过宿主机查看实际生效值,确认配置落地:
- CPU 权重:
cat /sys/fs/cgroup/docker/*/cpu.weight(v2)或cat /sys/fs/cgroup/cpu/docker/*/cpu.shares(v1) - 内存权重:
cat /sys/fs/cgroup/docker/*/memory.weight - 观察容器实际 CPU 利用率分布(
docker stats)和 OOM 事件(dmesg -T | grep -i "killed process")来反推权重是否合理 - 生产环境建议从默认值起步,按业务 SLA 分级:核心服务 weight 设高(如 800–1000),批处理类设低(如 100–300)










