Docker容器资源优先级配置核心是争抢时的调度顺序而非硬性独占:--cpu-shares设CPU时间片相对权重(默认1024),--memory-weight(1–10000)控OOM击杀顺序,需搭配--memory使用,I/O和GPU优先级需通过ionice或runtime label显式声明。

CPU 优先级:用 --cpu-shares 控制时间片分配权
当多个容器同时高负载运行时,内核 CFS 调度器会按 --cpu-shares 的相对值分配 CPU 时间。数值越高,分到的时间片越多。
- 默认值是 1024;设为 2048 的容器,在争抢中理论获得约 2 倍于 1024 容器的 CPU 时间
- 它不设上限也不保底:单容器空闲时仍可用满所有 CPU,只在竞争时生效
- 推荐组合使用:--cpu-shares=2048 --cpu-quota=100000 --cpu-period=100000,既保优先级,又防突发打满单核
内存抗压能力:用 --memory-weight 避免被 OOM 杀掉
Docker 20.10+ 在 cgroups v2 下支持 --memory-weight(范围 1–10000,默认 100),决定内存不足时 OOM killer 的“击杀顺序”。
- 权重越高越安全:设 --memory-weight=800 的数据库容器,比默认权重的服务更晚被杀
- 必须搭配 --memory 使用(如 -m 2g),否则 weight 不起作用
- 检查是否启用 cgroups v2:cat /proc/sys/fs/cgroup/unified/hybrid 应返回 0
I/O 和设备访问优先级:针对磁盘与加速器显式声明
普通容器默认 I/O 权重低,易被批量任务拖慢;GPU/FPGA 类 Offload 任务还需运行时识别优先级。
- 启动后手动调高 I/O 优先级:ionice -c 2 -n 0 -p $(pgrep -f "docker-containerd.*$CONTAINER_ID")
- GPU 任务通过 label 声明优先级(需 NVIDIA Container Runtime):com.nvidia.offload.priority: "high"
- 块设备权重(BlkIO)已弃用,v2 推荐统一用 io.weight,可通过 --device-read-bps 等限速间接体现优先级
验证与持续观察:别只看启动参数
配置是否真正落地,得去宿主机 cgroup 文件系统里查,不能只信 docker run 命令。
- 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
- 实时看效果:docker stats --no-stream 观察 CPU% 分布,结合 dmesg -T | grep -i "killed process" 看 OOM 记录











