Docker通过cgroups实现硬件资源公平调度:CPU用--cpu-shares(相对权重)和--cpu-quota/--cpu-period(硬性带宽限制);内存用--memory设硬上限防OOM;磁盘IO用--blkio-weight按设备权重调控优先级。

在 Docker 中配置硬件资源配额实现公平调度,核心是借助 Linux 内核的 cgroups 机制,对 CPU、内存、磁盘 IO 等资源设置相对权重或硬性上限,让多个容器在争用时按预设规则分配资源。关键不在于“独占”,而在于“有约束的竞争”。
CPU 公平调度:用份额(--cpu-shares)和配额(--cpu-quota/--cpu-period)
CPU 资源调度由内核 CFS(完全公平调度器)驱动,支持两种互补策略:
- --cpu-shares:设相对权重,默认 1024,范围 2–1024。仅在 CPU 饱和争用时生效,比如两个容器分别设为 1024 和 512,前者将获得约两倍的 CPU 时间;空闲时不设限。
-
--cpu-quota 与 --cpu-period:组合使用可硬性限制带宽。例如
--cpu-period=100000 --cpu-quota=30000表示每 100ms 最多运行 30ms,即稳定占用 30% 单核算力,不受负载波动影响。 - 快捷写法
--cpus=0.8等价于周期 100ms + 配额 80ms,适合快速设定逻辑核数级限制。
内存公平保障:用 --memory 设置硬上限防 OOM
内存不支持“权重分配”,必须设绝对上限才能避免一个容器吃光内存触发 OOM Killer 杀掉其他进程:
-
--memory=2g限制容器最大可用内存为 2GB;超出时进程会被内核终止。 - 建议配合
--memory-swap=2g禁用 swap,防止内存超限后靠交换空间掩盖问题。 - 注意:内存限制不保证最低保障(即无 requests 概念),只做上限防护。
磁盘 IO 公平竞争:用 --blkio-weight 和 --blkio-weight-device
Docker 借助 cgroups v1 blkio 子系统调节 IO 调度优先级,依赖 CFQ/BFQ 调度器(需宿主机启用):
-
--blkio-weight=800设全局 IO 权重(范围 10–1000,默认 500),仅在多个容器同时向同一设备(如 /dev/sda)发起同步 IO 时生效。 -
--blkio-weight-device /dev/sda:600 /dev/nvme0n1:900可为不同物理设备单独设权,适合混合存储场景(如数据库日志写 HDD、数据写 SSD)。 - 效果需用
iostat -x 1观察 %util 和 await,或iotop -o定位实际 IO 进程验证。
验证与动态调整
配额不是一设了之,要确认生效并观察实际效果:
- 查静态配置:
docker inspect 容器名 | grep -A 5 "Cpu\|Memory\|Blkio" - 运行中调整:
docker update --cpu-shares 768 --memory 4g 容器名 - 注意:部分参数(如 --blkio-weight)支持热更新,但 --memory 修改后新限制仅对后续内存分配生效,已占用内存不会立即回收。


















