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 可以查看当前系统支持的子系统,

Docker 技术基础之 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 可以查看。

Docker 技术基础之 CGroups
可以看到,每个子系统在 /sys/fs/cgroup/ 目录下都有相应的目录。
我们拿 cpu 子系统来看看,在控制台执行 ls /sys/fs/cgroup/cpu/
Docker 技术基础之 CGroups
其中,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 目录

Docker 技术基础之 CGroups
可以看到,系统自动在 container 创建了 cpu.cfs_period_us 和 cpu.cfs_quota_us 等进行资源限制的文件。

2. 在控制台执行 php loop.php &,loop.php 中代码如下

<php?

while (true) {
}

一般情况下,这个死循环会把 CPU 占到 100%,我们执行 top 指令看一下
Docker 技术基础之 CGroups
可以看到,CPU 的使用率已经 100% 了。

3. 限制进程使用的 CPU

我们查看一下 container 目录下的 cpu.cfs_quota_us 和 cpu.cfs_period_us,
Docker 技术基础之 CGroups
可以看到,输出值分别为 -1 和 100000(100ms),说明 container 控制组里的 CPU 还没任何限制。
接下来,向 cpu.cfs_quota_us 文件写入 20000(20ms),同时把 27667 写入 tasks
Docker 技术基础之 CGroups
结合 cpu.cfs_period_us 的值,表示每 100ms 的时间里,被控制组限制的进程只能使用 20ms 的 CPU,也就是 CPU 占用率为 20%。
Docker 技术基础之 CGroups

总结

本文中,我们简单介绍了

  • CGroups 是什么
  • CGroups 的使用场景
  • CGroups 的功能和子系统
  • CGroups 的一个小实验

参考

  1. wikipedia cgroups
  2. linux cgroups 简介
LDL1023
讨论数量: 1

挺好

3个月前 评论
LDL1023 (楼主) 3个月前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
高级后台开发 @ 速眠创新科技
文章
1
粉丝
0
喜欢
0
收藏
0
排名:1186
访问:478
私信
所有博文