前面提到过 cgroup对容器container进行资源限制,namespace对container进行隔离。
首先先来熟悉一下什么是资源控制
INSTALL测压工具
yum -y install epel-release
yum -y install stress
pull一个centos和一个测压镜像
docker pull centos:7.3.1611
docker pull progrium/stress
前提说明,docker的container默认是不进行限制的,但是生产环境中,我们需要跑很多的container,所以必须做资源限制
提示:如果测压线程大于分配的大小,容器则终端,下面测压的结果
现在我们来运行一个container,并做内存限制,再查看
docker run -dit --name nginx --hostname nginx -m 200M --memory-swap=300M centos:7.3.1611
这里没启动一个container,在/sys/fs/cgroup/memory/docker里面就会生成一个container id,在container id目录里面可以看到我们做的内存限制,以bytes为单位,转换为M,大约300M。
docker可以通过-c或者--cpu-shares设置container使用CPU的权重,默认1024也就是全部,但是我们设置CPU权重不是绝对的,docker会根据container的数量来分配CPU总数的比例。可能说的不太明白,下面我们实操来理解一下。为了更直观的看到我们结果,我把虚拟机改为一个CPU
docker run -it -c 1024 progrium/stress --cpu 1 执行过后再打开一个界面使用top查看
top查看我们的stress测压已经占用CPU的全部
下面我们再跑一个container,然后再查看
docker run -it -c 512 progrium/stress --cpu 1
可以看到又多了stress,CPU的占用率是第一个的一半,因为我们设置CPU权重一个是1024,一个是512。
最后我们在配置文件里面看一眼 cd /etc/fs/cgroup/cpu/docker/
docker run -dit -c 512 centos:7.3.1611
默认情况下所有container都可以平等的读写磁盘,可以通过 --blkio-weight来改变container的读写优先级,这里提一下,它和--cpu-shares类似,设置的是相对的权重值,不是绝对的。注意:目前Block io之对direct io(不使用缓存)有效
下面实操
--device-read-bps 限制读设备的bps
--device-weite-bps 限制写设备的bps
--device-read-iops 限制读设备的iops
--device-weite-ops 限制写设备的iops
docker run -it --name testio --hostname testio --blkio-weight 600 centos:7.3.1611
再开个命令界面
docker run -it --name testio2 --hostname testio2 --blkio-weight 300 centos:7.3.1611
分别用dd命令测试io的速度,可以明显看出来,第一个比第二个快了两倍。
我们再来跑一个container,限制io为30M
docker run -it --device-write-bps /dev/sda:30MB centos:7.3.1611
在使用dd命令测试,可以看到io只有30Mb/s