Docker容器磁盘读取权重通过cgroups v1 blkio子系统与CFQ/BFQ调度器实现相对优先级控制,取值10–1000,默认500;仅在多容器竞争同一设备(如/dev/sda)时按权重比例分配IO时间片,需先验证blkio挂载、启用及调度器支持,支持--blkio-weight全局设置和--blkio-weight-device设备级细粒度配置,可动态更新并配合iostat/iotop验证效果。

配置 Docker 容器的磁盘读取权重,本质是让多个容器在共享同一块物理磁盘(如 /dev/sda)时,按比例分配 IO 调度时间,从而缓解高 IO 容器“饿死”其他服务的问题。它不靠硬限速,而是通过内核 cgroups v1 blkio 子系统 + CFQ/BFQ 调度器实现相对优先级控制。
确认宿主机已就绪
权重机制不会自动生效,必须先验证底层支持:
- 运行
ls /sys/fs/cgroup/blkio/,目录存在且可读写才表示 blkio cgroup 已挂载 - 执行
cat /proc/cgroups | grep blkio,确保enabled列为1 - 检查当前调度器:
cat /sys/block/sda/queue/scheduler,输出中应有[cfq]或[bfq](推荐 CFQ,BFQ 在部分内核版本下对权重支持更稳定) - 若用 systemd 启动,需确认未启用 cgroups v2:检查内核启动参数是否含
systemd.unified_cgroup_hierarchy=0
使用 --blkio-weight 设置读取相对优先级
该参数影响同步读操作(如 open+read+fsync 类数据库查询、日志回放),也参与整体 IO 时间片分配。数值越高,在争抢时获得的磁盘服务时间占比越大:
- 取值范围为 10–1000,默认 500
- 两个容器权重分别为 800 和 200,则理论读取时间分配比约为 800 : 200 = 4 : 1(即高权重大致占 80%)
- 仅当它们同时向同一块设备(如都写
/dev/sda)发起大量 IO 时才起作用;单容器运行或写不同磁盘(sdavsnvme0n1)时无约束效果
示例:
docker run -d --name db --blkio-weight 900 postgres:15<br>docker run -d --name backup --blkio-weight 200 ubuntu:22.04 sh -c "while true; do dd if=/dev/urandom of=/tmp/backup.bin bs=1M count=100; sync; done"
此时若两者都密集读写 /dev/sda,数据库容器将明显更少受备份任务拖慢。
针对特定设备精细调控读取权重
当容器挂载了多类存储(如 SATA 盘存日志、NVMe 盘跑数据库),可用 --blkio-weight-device 为每块设备单独设权,互不干扰:
- 格式为
DEVICE_NAME:WEIGHT,例如/dev/sda:400或/dev/nvme0n1:900 - 设备名须与
lsblk或ls -l /dev/sd*输出一致;主次设备号错误会导致配置被忽略 - 可同时设置多个,例如一个容器既读 HDD 又读 SSD,可分别指定不同权重
示例:
docker run -d \<br> --blkio-weight-device /dev/sda:300 \<br> --blkio-weight-device /dev/nvme0n1:850 \<br> --name hybrid-app \<br> myapp:latest
验证与动态调整
配置不是一劳永逸,需观察实际效果并按需微调:
- 查看当前设置:
docker inspect mycontainer | grep -A 5 Blkio,确认BlkioWeight或BlkioWeightDevice字段已写入 - 运行中容器可热更新:
docker update --blkio-weight 600 mycontainer,无需重启 - 监控真实 IO 表现:
iostat -x 1关注%util(设备忙时率)和await(平均等待毫秒数);iotop -o定位具体容器进程的读取速率 - 注意:权重不保证绝对带宽,SSD/NVMe 因队列深度大、延迟低,CFQ 权重效果可能弱于传统硬盘,建议结合业务负载实测


















