Docker限制容器的Block IO

Block IO指的是磁盘的读写,docker可以通过设置权重以及限制bps和iops的方式控制容器读写磁盘的带宽。
通过命令

docker help run | grep -E ‘bps|IO’

可以查询block IO的选项参数。
Docker限制容器的Block IO

主要参数有:
–blkio-weight:容器默认磁盘IO的加权值,有效值范围为10-1000。
–blkio-weight-device: 针对特定设备的IO加权控制。其格式为DEVICE_NAME:WEIGHT
–device-read-bps:限制此设备上的读速度(bytes per second),单位可以是KB、MB或者GB。
–device-read-iops:通过每秒读IO次数来限制指定设备的读速度。
–device-write-bps :限制此设备上的写速度(bytes per second),单位可以是KB、MB或者GB。
–device-write-iops:通过每秒写IO次数来限制指定设备的写速度。

接下来将介绍每一个命令的具体使用方法。

1、–blkio-weight、–blkio-weight-device

使用以下命令创建容器

docker run -it --rm --blkio-weight 100 centos /bin/bash

Docker限制容器的Block IO
采用docker inspect 命令查看生成的容器的元数据。

Docker限制容器的Block IO

2、–device-write-bps、–device-read-bps

2.1 --device-write-bps

使用以下命令创建容器,并限制容器的写入速度是上限30MB/s

docker run -it --rm --device-write-bps /dev/sda:30MB centos

采用docker inspect命令对容器数据进行查看,发现设置成功。
Docker限制容器的Block IO

在容器内采用dd命令对容器的写入速度进行测试,验证其读写速度在30M左右,其中oflag=direct 指定用 direct IO 方式写文件,这样 --device-write-bps 才能生效。
Docker限制容器的Block IO
如果不采用oflag=direct方式,进行测试,发现速度为2.0GB/s,也间接说明成功限制容器写入速度。
Docker限制容器的Block IO

2.2 --device-read-bps

使用以下命令创建容器,并限制容器的读出数据速度是上限30MB/s

docker run -it --rm --device-read-bps /dev/sda:30MB centos

同样,采用docker inspect命令对容器数据进行查看,发现设置成功。
Docker限制容器的Block IO
在容器内采用dd命令对容器的写入速度进行测试,验证其读写速度在30M左右。首先需要生成读取数据文件test.out。

time dd if=/dev/zero of=test.out bs=1M count=256

Docker限制容器的Block IO
然后再运行dd命令,对容器读取数据速度进行测试,和–device-write-bps类似,iflag=direct是对–device-read-bps的读取速度进行限制。

time dd if=test.out of=/dev/zero bs=1M iflag=direct

Docker限制容器的Block IO
在不加iflag=direct的情况下进行测试,发现速度为7.9GB/s,远远大于30MB/s,从而可以看出成功限制容器读取数据的速度。
Docker限制容器的Block IO

3、–device-write-iops,–device-read-iops

–device-write-iops,–device-read-iops是通过限制容器每秒读取IO的次数来限制容器的读写速度。

3.1 --device-write-iops

使用以下命令创建容器,并限制容器的每秒写入数据次数不超过30次。

docker run -it --rm --device-write-iops /dev/sda:30 centos

同样,采用docker inspect命令对容器数据进行查看,发现设置成功。
Docker限制容器的Block IO
在容器内采用dd命令对容器的写入速度进行测试,写入速度限制到了15.8MB/s。

time dd if=/dev/zero of=test.out bs=1M count=256 oflag=direct
Docker限制容器的Block IO

在不加oflag-direct的时候进行测试,速度为2.4GB/s,说明限制容器写入次数成功。
Docker限制容器的Block IO

3.2 --device-read-iops

使用以下命令创建容器,并限制容器的每秒读取数据次数不超过30次。

docker run -it --rm --device-read-iops /dev/sda:30 centos

同样,采用docker inspect命令对容器数据进行查看,发现设置成功。

Docker限制容器的Block IO
然后在运行dd命令对容器每秒读取io次数进行查看,命令格式通–device-read-bps,接下来将不再进行赘述,直接上图,读取速度为15.8MB/s。
Docker限制容器的Block IO
在不加iflag=direct的情况下进行测试,发现读取速度为9.0GB/s远大于15.8MB/s,说明限制容器读取次数成功。
Docker限制容器的Block IO