Cgroup是Control group的简写,是Linux内核提供的一种限制所使用物理资源的机制.这些资源主要包括CPU、内存.blkio。下面就这3个方面来谈一下Docker是如何使用Cgroup机制进行管理的。
1、对CPU的控制
1.1、限制CPU使用速率
在CentOS 7,3中可以通过修改对应的Cgroup配置文件cpu.cfs_quota_us的值来实现.直接执行echo命令将设定值导入到此文件中就会立即生效。
例如,将容器26dd7c8f4b83的CPU使用设置为20000,设置CPU的使用率限定为20%:
[root@blab ~]# echo 20000 > /sys/fs/cgroup/cpu/system.slice/docker-26dd7c8f4b832b3cfc85f0d16b420a58431748b69807be0acc7aa7aaeba2f632.scope/cpu.cfs_quota_us
1.2、多任务按比例分享CPU
当多个容器任务运行时,很难计算CPU的使用率,为了使容器合理使用CPU资源.可以通过---cpu-share选项设置CPU按比例共享CPU资源,这种方式还可以实现CPU使用率的动态调整。
例如,运行3个新建容器A、B、C,占用CPU资源的比例为1∶1∶2,就可以这样执行:
-
[root@blab ~]# docker run -tid --cpu-shares 1024 docker.io/networkboot/dhcpd
-
09256abb60551d688b2c9b7c8955166c76ff737977b3c574413da179c0837d2e
-
[root@blab ~]# docker run -tid --cpu-shares 1024 docker.io/networkboot/dhcpd
-
60388c22bd6bf5744472d5a27e895409fdb2b56191b0f079f945e997d02d193b
-
[root@blab ~]# docker run -tid --cpu-shares 2048 docker.io/networkboot/dhcpd
-
21440d850999325b745f71c4fe1eab452b60dd8e6d2b306c147fea0d500b721a
如果又有一个容器D需要更多的CPJ资源.则可以将其---—-cpu-share的值设置为4096,那么A.B.C.D的CPU资源占用比例变为1:1∶2∶ 4。
1.3、现在CPU内核使用
在Docker中可以使用一—cpUset--cpus选项来使某些程序独享CPU内核.以便提高其处理速度.对应的Cgroup配置文件为/sys/fs/cgroup/cpuset /systerm ,slice /docker一容器编号/cpuset ,cpus。选项后直接跟参数0.1、2…表示第1个内核.第⒉个内核.第3个内核,.与/proc/cpuinto 中的CPU编号(Processor)相同,
如果服务器有16个核心,那么CPU编号为0~15,使新建容器绑定第1~2的内核使用,则
-
[root@blab ~]# docker run -tid --cpuset-cpus 0,1 docker.io/networkboot/dhcpd
-
cf54cc503e7209320361dfd381699e479cad6438bcf5746dda391e6690982a31
那么该容器内的进程只会在编号1、2的CPU上运行。
尽量使用绑定内核的方式分配CPU资源给容器进程使用.然后再配合--cpu-share选项动态调整CPU使用资源的比例。
2、对内存使用的限制
在Docker中可以通过docker run --m 命令来限制容器内存使用量.相应的Cgroup配置文件为/sys/is/cgroup/memory / system , slice/docker一容器编号.scope/memory . limit_in_bytes,但是需要注意,一旦容器Cgroup使用的内存超过了限制的容量,Linux内核将会尝试收回这些内存,如果仍旧没法控制使用内存在限制范围之内,进程就会被杀死.
例如,限制新建容器的内存上限为512MB。
-
[root@blab ~]# docker run -tid -m 512MB docker.io/networkboot/dhcpd
-
6901afd22692874c64394cb7be696447162f9d4ed3994b4bc8da4224416cf840
3、对blkio的限制
如果在一台服务器上进行容器的混合部署,那么会存在同时几个程序写磁盘数据的情况.这时可以通过--device-write-iops选项来限制每秒写io 次数来限制指定设备的写速度。相应的还有--device-read-bps 选项可以限制读取的速度.但是这种方法只能限制设备,而不能限制分区。相应的Cgroup 写配置文件为/sys/fs/cgroup/blkio/docker一容器ID/blkio , throttle , write_bps_device,
例如.限制新建容器的/dev/sda的写入速度为1MB.
-
[root@blab ~]# docker run -tid --device-write-bps /dev/sda:1MB docker.io/networkboot/dhcpd
-
ab4db16cbe3798085a3ab98c1726803036a8a3df8324c577c929d56a1401ef47