Docker与Cgroups资源控制实战
一、Cgroups简介
Cgroups(Control Groups)是Linux内核提供的一种机制,用于将进程按组进行管理,并限制和统计这些进程的资源使用情况。这些资源包括CPU、内存、存储、网络等。通过Cgroups,系统管理员可以方便地限制某个进程或进程组的资源占用,并实时监控这些资源的使用情况。
Cgroups的核心概念包括cgroup、subsystem和hierarchy。
- cgroup:cgroup是对进程分组管理的一种机制,一个cgroup包含一组进程,并可以在这个cgroup上增加Linux subsystem的各种参数配置,将一组进程和一组subsystem的系统参数关联起来。
- subsystem:subsystem是一个内核模块,被关联到一颗cgroup树之后,就会在树的每个节点(进程组)上做具体的操作。subsystem经常被称作“resource controller”,因为它主要被用来调度或者限制每个进程组的资源。
- hierarchy:hierarchy可以理解为一棵cgroup树,树的每个节点就是一个进程组,每棵树都会与零到多个subsystem关联。在一颗树里面,会包含Linux系统中的所有进程,但每个进程只能属于一个节点(进程组)。
Linux支持多种subsystem,例如限制CPU的使用时间、限制使用的内存、统计CPU的使用情况等。这些subsystem可以单独或组合使用,以满足不同的资源管理需求。
二、Cgroups资源控制实战
1. 查看Cgroups信息
在进行Cgroups资源控制之前,首先需要查看当前系统支持的subsystem和cgroup树的信息。
cat /proc/cgroups
该命令将显示当前系统支持的subsystem列表以及它们所关联的cgroup树的ID。
2. 创建Cgroups
在/sys/fs/cgroup目录下,可以看到各种资源的cgroup控制目录,如cpu、memory、blkio等。可以通过在这些目录下创建子目录来创建新的cgroup。
例如,创建一个名为test_cpu的cpu cgroup:
sudo mkdir /sys/fs/cgroup/cpu/test_cpu
同样地,可以创建一个名为test_mem的memory cgroup:
sudo mkdir /sys/fs/cgroup/memory/test_mem
创建cgroup后,系统会自动在相应的目录中生成配置文件,用于设置资源限制。
3. 设置CPU资源限制
在/sys/fs/cgroup/cpu/test_cpu目录下,可以看到一些用于设置CPU资源限制的文件,如cpu.cfs_quota_us和cpu.cfs_period_us。
- cpu.cfs_quota_us:表示该cgroup限制占用的CPU时间(微秒)。
- cpu.cfs_period_us:表示CPU分配的周期(微秒)。
例如,要将test_cpu cgroup的CPU使用率限制为20%,可以执行以下命令:
echo 20000 | sudo tee /sys/fs/cgroup/cpu/test_cpu/cpu.cfs_quota_us
echo 100000 | sudo tee /sys/fs/cgroup/cpu/test_cpu/cpu.cfs_period_us
这里,cpu.cfs_quota_us设置为20000,cpu.cfs_period_us设置为100000,因此CPU使用率限制为20%(20000/100000)。
4. 设置内存资源限制
在/sys/fs/cgroup/memory/test_mem目录下,可以看到一些用于设置内存资源限制的文件,如memory.limit_in_bytes和memory.swappiness。
- memory.limit_in_bytes:表示该cgroup可以使用的最大内存量(字节)。
- memory.swappiness:表示该cgroup的交换行为(0-100),值越高表示越倾向于使用交换空间。
例如,要将test_mem cgroup的内存使用量限制为200MB,可以执行以下命令:
echo 209715200 | sudo tee /sys/fs/cgroup/memory/test_mem/memory.limit_in_bytes
这里,memory.limit_in_bytes设置为209715200字节(即200MB)。
5. 将进程添加到Cgroups
创建并设置好cgroup后,需要将目标进程添加到相应的cgroup中。这可以通过将进程的PID写入cgroup的tasks文件来实现。
例如,要将PID为1234的进程添加到test_cpu cgroup中,可以执行以下命令:
echo 1234 | sudo tee /sys/fs/cgroup/cpu/test_cpu/tasks
同样地,可以将进程添加到test_mem cgroup中:
echo 1234 | sudo tee /sys/fs/cgroup/memory/test_mem/tasks
6. 使用Docker进行Cgroups资源控制
Docker本质上也是通过调用Cgroups的API来完成对资源的管理的。Docker提供了丰富的选项来限制容器的资源使用。
-
限制CPU使用:
在创建Docker容器时,可以使用–cpu-quota和–cpu-period选项来限制容器的CPU使用。
docker run -itd --name test_container --cpu-quota=20000 --cpu-period=100000 centos:7 /bin/bash
这里,–cpu-quota设置为20000,–cpu-period设置为100000,因此容器的CPU使用率限制为20%(20000/100000)。
-
限制内存使用:
在创建Docker容器时,可以使用-m或–memory选项来限制容器的内存使用。
docker run -itd --name test_container -m 200m centos:7 /bin/bash
这里,-m或–memory设置为200m(即200MB)。
-
限制磁盘IO:
在创建Docker容器时,可以使用–device-read-bps和–device-write-bps等选项来限制容器的磁盘IO。
docker run -itd --name test_container --device-read-bps /dev/sda:1mb --device-write-bps /dev/sda:1mb centos:7 /bin/bash
这里,–device-read-bps和–device-write-bps分别设置为1mb,表示限制容器的磁盘读写速度为1MB/s。
7. 监控资源使用情况
在设置了Cgroups资源限制后,可以使用一些工具来监控资源的使用情况。例如,pidstat是sysstat的一个命令,用于监控全部或指定进程的CPU、内存、线程、设备IO等系统资源的占用情况。
pidstat -u -r -d -p ALL 1
该命令将每秒显示一次所有进程的CPU、内存和IO使用情况。
另外,还可以使用Docker自带的命令来监控容器的资源使用情况。例如,docker stats命令可以显示容器的CPU、内存、网络IO等使用情况。
docker stats
三、总结
Cgroups是Linux内核提供的一种强大的资源管理机制,通过它可以方便地限制和统计进程组的资源使用情况。Docker也利用了Cgroups来实现对容器资源的控制。通过合理配置Cgroups和Docker的选项,可以有效地管理系统的资源使用,提高系统的稳定性和性能。
在实际应用中,需要根据具体的需求和场景来设置Cgroups和Docker的资源限制。例如,在部署高并发应用时,可能需要限制容器的CPU和内存使用,以避免资源竞争和性能下降。在部署大数据处理应用时,可能需要限制容器的磁盘IO和网络带宽,以确保数据的处理速度和安全性。
此外,还需要注意Cgroups和Docker资源限制的相互影响。例如,在设置了Docker容器的CPU限制后,可能会影响容器的内存和网络性能。因此,在进行资源限制时,需要综合考虑各种因素,并进行充分的测试和验证。
通过合理使用Cgroups和Docker的资源控制功能,可以实现对系统资源的精细化管理,提高系统的可靠性和性能。这对于构建高效、稳定、可扩展的云计算和容器化应用环境具有重要意义。