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