Docker容器IO优先级通过cgroups v1 blkio子系统实现,支持--blkio-weight(10–1000,仅CFQ调度器)、--device-read-bps和--device-write-bps等参数限速,推荐生产环境使用限速而非权重。

在 Docker 中配置容器的磁盘 IO 读写优先级,主要通过 cgroups v1 的 blkio 子系统(Linux 内核机制)实现,Docker 本身不提供高级 IO 调度策略(如 deadline、cfq),但支持为容器设置 IO 权重、IO 限速和 IO 百分比分配。关键在于使用 --blkio-weight、--device-read-bps、--device-write-bps 等运行时参数,并确保宿主机内核和存储驱动支持。
确认宿主机支持 blkio cgroup
IO 优先级控制依赖内核的 blkio cgroup 控制器。需确认已启用:
- 检查
/sys/fs/cgroup/blkio/是否存在且可读写 - 运行
cat /proc/cgroups | grep blkio,确认enabled列为 1 - 若使用 systemd,确保启动时启用了
systemd.unified_cgroup_hierarchy=0(cgroups v1);Docker 默认仍主要兼容 v1 的 blkio - 注意:cgroups v2 对 blkio 支持有限(截至 kernel 6.5,
io.weight仅支持 CFQ 调度器,且多数云环境默认用 none/mq-deadline),生产环境建议明确使用 cgroups v1 + CFQ(如需权重)或直接限速
设置 IO 权重(相对优先级)
--blkio-weight 指定容器在**同一块设备上与其他加权容器竞争时的相对 IO 权重**,取值范围 10–1000,默认为 500。仅对 CFQ I/O 调度器生效,且只影响异步 IO(如 buffered write):
- 启动高优容器:
docker run --blkio-weight 800 -it ubuntu - 启动低优容器:
docker run --blkio-weight 200 -it ubuntu - 权重仅在多个容器同时向同一块物理设备(如
/dev/sda)发起 IO 时才起作用;若容器挂载不同磁盘(如 sda vs nvme0n1),权重互不影响 - CFQ 调度器需手动启用:
echo cfq > /sys/block/sda/queue/scheduler(重启后失效,需持久化)
限制 IO 带宽(更常用、更可靠)
相比权重,限速(bps)不依赖调度器类型,适用于所有场景,推荐用于生产环境的 IO 隔离:
- 限制读吞吐:
--device-read-bps=/dev/sda:50mb(每秒最多读 50MB) - 限制写吞吐:
--device-write-bps=/dev/sda:10mb - 限制 IOPS(需换算):
--device-read-iops=/dev/sda:1000(每秒最多 1000 次读操作,基于 4KB 块大小) - 可同时设置多个设备,例如:
--device-read-bps=/dev/sda:20mb --device-read-bps=/dev/nvme0n1:100mb - 注意:路径必须是宿主机上的真实块设备节点(
/dev/sdX,/dev/nvmeXnY),不能是文件或 LVM 逻辑卷别名
验证与调试 IO 配置
容器启动后,可通过以下方式确认配置是否生效:
- 查看容器 cgroup 路径:
docker inspect,定位到| grep -i cgroup BlkioWeight或BlkioDeviceReadBps字段 - 进入容器对应 cgroup 目录(如
/sys/fs/cgroup/blkio/docker/),检查:/ cat blkio.weight(权重值)cat blkio.throttle.read_bps_device(限速规则) - 在宿主机用
iotop -oP或pidstat -d 1观察各容器进程的实际 IO 使用量 - 用
fio在容器内压测:fio --name=randwrite --ioengine=libaio --rw=randwrite --bs=4k --numjobs=4 --size=1g --runtime=60 --time_based,对比不同权重/限速下的吞吐差异










