Docker 技术基础之 CGroups
简介
我们都知道,docker 容器具有很好的隔离性,我们可以在一台服务器上运行很多 docker 容器。
虽然一台服务器可以运行着很多 docker 容器,但这些容器是共用一台服务器的 CPU 和内存资源的,如果任由容器随意使用资源不加限制的话,很有可能会造成一部分容器占用过多资源,而其他容器无法正常运行。
docker 基于这点考虑,提供了控制容器资源的功能,而这个功能,是利用 Linux 的 CGroups 来实现的。
接下来我们来了解和实验一下 Linux 的 CGroups。
CGroup 介绍
CGroups,Control Groups 的缩写,用来限制、控制与分离一个进程组群的资源,如 CPU、内存、磁盘、网络 IO 等,是将任意进程进行分组化管理的 Linux 内核功能。
主要目的是为不同用户层面的资源管理提供一个统一化的接口。
功能及子系统
功能
CGroups 提供了四大功能:
- 资源限制:CGroups 可以对任务需要的资源总额进行限制。比如设定任务运行时使用的内存上限,一旦超出就发 OOM。
- 优先级分配:通过分配的 CPU 时间片数量和磁盘 IO 带宽,实际上就等同于控制了任务运行的优先级。
- 资源统计:CGroups 可以统计系统的资源使用量,比如 CPU 使用时长、内存用量等。
- 任务控制:CGroups 可以对任务执行挂起、恢复等操作。
任务(Task),表示操作系统的一个进程或者线程。
子系统
子系统,英文是 Subsystem,是 CGroups 中资源调度控制器(又叫 Controllers)。
我们在 Linux 控制台下执行 cat /proc/cgroups
可以查看当前系统支持的子系统,
- cpuset:为 CGroups 中的任务分配独立 CPU(在多核系统)和内存节点。
- cpu:限制 CPU 时间片的分配,与 cpuacct 挂载在同一目录。
- cpuacct:生成 CGroups 中的任务占用 CPU 资源的报告,与 cpu 挂载在同一目录。
- blkio:对块设备的 IO 进行限制。
- memory:对 CGroups 中的任务的可用内存进行限制,并自动生成资源占用报告。
- devices:允许或禁止 CGroups 中的任务访问设备。
- freezer:暂停/恢复 CGroups 中的任务。
- net_cls:使用等级识别符(classid)标记网络数据包,这让 Linux 流量控制器(tc 指令)可以识别来自特定 CGroups 任务的数据包,并进行网络限制。
- perf_event:
- net_prio:允许基于 CGroups 设置网络流量(netowork traffic)的优先级。
- hugetlb:限制使用的内存页数量。
- pids:限制任务的数量。
使用方法
CGroups 给用户暴露出来的操作接口是文件系统,即它以文件和目录的形式组织在 /sys/fs/cgroup/
目录下。我们在 Linux 控制台下执行 mount -t cgroup
可以查看。
可以看到,每个子系统在 /sys/fs/cgroup/
目录下都有相应的目录。
我们拿 cpu 子系统来看看,在控制台执行 ls /sys/fs/cgroup/cpu/
,
其中,cpu.cfs_period_us 和 cpu.cfs_quota_us 这两个参数要组合使用,可以用来限制进程在长度为 cpu.cfs_period_us 的时间内,只能被分配到总量为 cpu.cfs_quota_us 的 CPU 时间。
接下来让我们实验一下。
1. 在控制台执行 mkdir -p /sys/fs/cgroup/cpu/container
,查看 container 目录
可以看到,系统自动在 container 创建了 cpu.cfs_period_us 和 cpu.cfs_quota_us 等进行资源限制的文件。
2. 在控制台执行 php loop.php &
,loop.php 中代码如下
<php?
while (true) {
}
一般情况下,这个死循环会把 CPU 占到 100%,我们执行 top 指令看一下
可以看到,CPU 的使用率已经 100% 了。
3. 限制进程使用的 CPU
我们查看一下 container 目录下的 cpu.cfs_quota_us 和 cpu.cfs_period_us,
可以看到,输出值分别为 -1 和 100000(100ms),说明 container 控制组里的 CPU 还没任何限制。
接下来,向 cpu.cfs_quota_us 文件写入 20000(20ms),同时把 27667 写入 tasks
结合 cpu.cfs_period_us 的值,表示每 100ms 的时间里,被控制组限制的进程只能使用 20ms 的 CPU,也就是 CPU 占用率为 20%。
总结
本文中,我们简单介绍了
- CGroups 是什么
- CGroups 的使用场景
- CGroups 的功能和子系统
- CGroups 的一个小实验
参考
本作品采用《CC 协议》,转载必须注明作者和本文链接
挺好