Docker的Linux CGroup
1.什么是Linux CGroup
由于Docker构建在Linux的基础之上,因此从Linux底层来看,Docker是利用LinuxControl Group(简称Linux CGroup)来实现对资源使用的控制。
LinuxCGroup主要提供了以下功能。
Resourcelimitation;限制资源的使用,例如,使用CPU及内存的上限
Prioritization:应用的优先级控制,例如,控制任务的调度。
Accounting:应用的审计和统计,例如,实现应用的计费。
Control:实现对应用的控制,例如,应用的挂起、恢复和执行等。
要使用 Linux CGroup,则需要先通过执行以下步骤确定 Linux 的内核是否启用了Linux CGroup。
确认操作系统的发型版本
根据操作系统的发行版本,可以确定是否启动了Linux CGroup。
[root@localhost ~]# cat /boot/config-3.10.0-957.el7.x86_64 | grep CGROUP
下面通过三个示例如何使用Linux CGroup实现对系统资源的控制
2.通过Linux CGroup限制应用的CPU使用率
本次示例中,利用C语言开发一段执行死循环的命令。由于是死循环,所以代码的CPU使用率将很高。然后通过使用LIinux CGroup,将代码的CPU使用率限制在一定范围内,如20%。下面是具体的操作步骤
开发一段C语言程序代码产生一个死循环,并将代码保存为 hello.c。
[root@localhost ~]# vim hello.c
//hello.c
int main(void)
{
int i = 0;
for(;;) i++;
return 0;
}
将程序代码进行编译
[root@localhost ~]# gcc -o hello hello.c
执行程序代码,这时程序将产生死循环无法退出。
[root@localhost ~]# ./hello
24%20151025.png&pos_id=img-6ss4rD9S-1700812239332)
在一个新的命令行窗口,使用"top"命令监控应用hello的CPU的使用率,可以看到已经达到了99.9%
进入"/sys/fs/cgroup/cpu"目录下,创建一个新的子目录hello。该目录用于设置CPU使用的闻值
[root@localhost ~]# cd /sys/fs/cgroup/cpu/
[root@localhost cpu]# mkdir hello
查看cpu.cfquota_us的内容为"-1",表示没有对其CPU使用率进行限制
执行以下语句将CPU使用率的闻值设置为20%。
[root@localhost hello]# echo 20000 > cpu.cfs_quota_us
将应用hello的进程ID写入tasks文件
[root@localhost hello]# echo 8216 > tasks
再次观察“top”命令的输出信息,发现应用hello的CPU使用率降到了20% 。
重新启动一个hello 应用,并按照上面的步骤将进程D 写入tasks 文件。这时观察“top”命令的输出会发现,两个 hello 应用各自占用10%的CPU使用率
[root@localhost hello]# echo 8525 >>tasks
3通过LinuxCGroup限制应用使用系统内存
进入"cd/sys/fs/cgroup/memory"目录下,创建子目录hello。
[root@localhost ~]# cd /sys/fs/cgroup/memory/
[root@localhost memory]# mkdir hello
[root@localhost memory]# cd hello
查看文件memory.limit_in_bytes的内容
[root@localhost hello]# more memory.limit_in_bytes
9223372036854771712
这里设定的值 9223372036854771712 表示没有对内存进行任何限制。
下面的语句会将内存的闽值设置为64KB。如果应用使用的内存超过了该值,则该应用会被操作系统自动"杀掉"。
[root@localhost hello]# echo 64k > memory.limit_in_bytes
生效配置,将应用hello的进程ID写入tasks文件
[root@localhost hello]# echo 8609 > tasks
4通过Linux CGroup 限制应用使用I/O带宽
为了更好地观察结果首先安装iotop工具
[root@localhost hello]# yum -y install iotop
iotop工具用来监视磁盘I/O使用状况,包括pid、user、I/O、进程等相关信息
下面演示如何使用Linux CGroup 限制应用使用I/O带宽
使用Liunx的"dd"命令从磁盘持续读写数据
[root@localhost hello]# dd if=/dev/sda of=/dev/null
通过iotop工具查看I/O读取的速度为983.43 M/s
[root@localhost ~]# iotop
查看设备"/dev/sda"的信息
[root@localhost hello]# ls -l /dev/sda
可以看到,设备"/dev/sda"的设备号是"disk8,0"
使用LinuxCGroup限制I/O对设备"/dev/sda"的读取速率
[root@localhost ~]# mkdir /sys/fs/cgroup/blkio/io
[root@localhost ~]# cd /sys/fs/cgroup/blkio/io
[root@localhost io]# echo '8:0 1048576' > blkio.throttle.read_bps_device
通过这样,I/O对该设备的读取速率被限制在1M/S之内了
将"dd"命令的进程ID写入tasks文件
[root@localhost io]# echo 8890 > tasks
再次观察iotop工具的监控输出信息就会发现,这时"dd"命令对该设备的读取速率已经被设置为1 M/S
了解了 Linux CGroup后,再来讨论“Docker 是如何对容器使用的资源进行设定的”就变得非常简单了。Docker只是对 Linux CGroup进行了封装,从而简化了调用操作的方式。