如何做好Docker资源管控?

Docker资源管控配额原理

Docker同LXC一样,其对资源的隔离和管控是以Linux内核的namespaces和cgroups为基础。Docker的资源隔离使用了Linux内核 Kernel中的Namespaces功能来实现,隔离的对象包括:主机名与域名、进程编号、网络设备、文件系统的挂载点等,namespace中的IPC隔离docker并未使用,docker中使用TCP替代IPC。

在使用Namespaces隔离资源的同时,Docker使用了Linux内核Kernel提供的cgroups来对Container使用的CPU、内存、磁盘IO资源进行配额管控。换句话说,在docker的容器启动参数中,像—cpu、–memory和—blkio*的设置,实际上就是设置cgroups的相对应cpu子系统、内存子系统、磁盘IO子系统的配额控制文件,只不过这个修改配额控制文件的过程是docker实例代替我们做掉罢了。

因此,我们完全可以直接修改docker容器所对应的cgroup子系统中的配额控制文件来达到控制docker容器资源配额的同样目的,接下来将以IO控制为例,介绍一下具体实现过程。

物理部署架构图

实验测试环境物理部署图如下:

整体的部署思路如下:

1、 将物理磁盘进行分区操作(此步骤可选)
2、将分区创建为物理卷(PV)并添加到卷组(VG)中
3、从卷组(VG)中创建出逻辑卷(LV),并将该卷格式化后挂载供docker使用
4、将步骤3中逻辑卷挂载点再挂载到docker镜像容器中

管控配额过程

1、将磁盘设备/dev/sdb进行分区,分别为sdb1和sdb2

2、创建PV

pvcreate /dev/sdb2  #使用sdb2创建物理卷(PV)

3、创建VG

vgcreate datavg /dev/sdb2 #vg名称为datavg

4、创建LV,并格式化

lvcreate  -n  datalv  datavg  && mkfs.ext4 /dev/mapper/datavg-datalv

5、创建目录并挂载

mkdir /data && mount /dev/mapper/datavg-datalv /data

测试验证

1、使用docker镜像docker.io/learn/tutorial :jiangzt作为测试容器

2、不加配额参数的情况下启动容器

启动容器时不配额参数,并观察其所在的cgroups子系统的配置情况。

docker run -dit -h inner --name test -v /data:/data a36927dbb31f /bin/bash

根据容器ID观察cgroups下blkio子系统的配置情况,结果是文件blkio.throttle.write_bps_device中没有内容。

进入容器内,执行dd命令,测试观察此时默认的写入IO能力。

docker exec -it test  /bin/bash
time dd if=/dev/zero of=/data/test.out bs=1M count=1024 oflag=direct

可以得知写入的平均速度是 2.1GB/s

3、使用参数device-write-bps启动容器

启动容器增加配额参数device-write-bps,写入目标速度为1mb/s,并观察其所在的cgroups子系统的配置情况。

docker run -dit  -m 100m -h inner --name test --device-write-bps /dev/dm-6:1mb  -v /data:/data a36927dbb31f /bin/bash

说明:lv的设备名称/dev/dm-6可以通过dmsetup做查询

容器启动后根据容器id观察cgroups子系统中的配置情况。


在cgroups的blkio.throttle.write_bps_device文件中观察到了253:6 1048576 就是我们在启动docker时指定的–device-write-bps参数值,设备为253:6(/dev/dm-6),io能力为1048576byte(1mb)

进入容器内,执行dd命令,测试观察此时默认的写入IO能力

可以观察到此时的写入速度为1.0MB/s

4、直接修改cgroup中的参数配置

前面在原理介绍时提过,docker其实也是修改cgroup中的参数来控制资源的使用,那么我们直接修改blkio.throttle.write_bps_device,然后观察是否能直接作用于docker容器,还是使用上面的容器id进行操作,将blkio.throttle.write_bps_device中的内容修改为10MB/s。
echo 253:6 10485760 > blkio.throttle.write_bps_device
进入容器内,执行dd命令,测试观察此时默认的写入IO能力。

可以看到通过直接修改cgroup中的blkio.throttle.write_bps_device的速度值起到了作用。

5、对于其他参数的控制分析

细心的你可能已经发现在docker镜像时,还有个参数-m 100m,该参数是用来控制容器使用内存的配额,我们可以通过docker stats进行验证。

同样我们也是可以在cgroup的内存子系统中看到相应的参数配置。

总结

通过以上的分析测试,进一步熟悉了解了docker运行时的行为和所依赖的底层的技术原理,希望能够为docker的自动化运维开发提供解决思路和办法。

标签:Docker 发布于:2019-10-25 23:31:00