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

在 Docker 中配置容器资源权重分配,核心目标不是“平均分资源”,而是让多任务并行时,关键服务在争抢中优先获得 CPU 时间、内存不被轻易回收。这特别适合微服务共存、CI/构建节点或混合负载场景——比如一个宿主机上同时跑着 API 服务、日志采集器和定时任务。
CPU 权重:用 --cpu-shares 控制调度优先级
--cpu-shares 设置的是相对调度权重,默认值是 1024。它不设硬上限,也不保底,只在多个容器同时高负载争抢 CPU 时起作用。
- 两个容器分别设为 --cpu-shares=512 和 --cpu-shares=2048,理论 CPU 时间分配比约为 1:4
- 若只有高权重容器在运行,它仍可吃满全部 CPU;低权重容器空闲时,高权重容器不会“多拿”
- 该参数在 cgroups v2 下仍有效,Docker 会自动映射为
cpu.weight
内存权重:用 --memory-weight 调整 OOM 生存顺序
从 Docker 20.10 开始,cgroups v2 支持 --memory-weight(范围 1–10000,默认 100),用于决定内存压力下哪个容器更可能被 OOM killer 干掉。
- 权重越高越抗杀:比如缓存服务(Redis)可设 --memory-weight=800,避免因临时内存峰值被误杀
- 后台批处理任务可设为 --memory-weight=10,让它在内存紧张时优先释放资源
- 需确认宿主机启用 cgroups v2:
cat /proc/sys/fs/cgroup/unified/hybrid应输出 0
搭配软性限制,让权重真正落地
纯权重容易被突发负载带偏,建议组合使用:
-
CPU 方向:用
--cpu-quota+--cpu-period设最大可用时间(例如每 100ms 最多用 60ms),再配合--cpu-shares做争抢分配 -
内存方向:用
--memory设硬上限防失控,再用--memory-weight调整 OOM 顺序 - 避免混用旧参数:不要同时设
--memory-reservation(cgroups v1)和--memory-weight(v2),行为不可预期
验证是否生效
启动容器后,直接在宿主机检查底层值:
- CPU 权重:
cat /sys/fs/cgroup/docker/*/cpu.weight - 内存权重:
cat /sys/fs/cgroup/docker/*/memory.weight - 实时观察资源分布:
docker stats查看 CPU% 和 MEM% 实际占比 - 查 OOM 记录:
dmesg -T | grep -i "killed process"


















