man 7 cgroup

Author Avatar
STRRL 5月 02, 2020

[toc]

NAME

cgroups - Linux control groups

DESCRIPTION

Control groups, 通常称为 cgroups, 是一个 linux 内核 feature, 将进程组织为有层次结构的组, 然后可以对各种类型的资源进行限制与监控. 内核中的 cgroup 接口以一个被称为 cgroupfs 的伪文件系统的形式提供. 分组在 cgroup 核心内核代码中实现, 不同的资源(内存, CPU 等等)被分别地追踪和监视, 实现在不同的子系统中.

Terminology 术语

cgroup是一组进程的集合, 绑定了一组限制和参数, 通过 cgroupfs 定义.

subsystem 是一个内核组件(kernel component), 修改 cgroup 中进程的行为. 不同的 subsystem 已经被实现了, 可以实现比如: 限制 cgroup 中 CPU 时间的用量和可使用内存, 统计 cgroup 中已使用的 CPU 时间, 冻结/恢复 cgroup 中进程的执行. Subsystems 因也被称为resource controllers(或者简称 controllers).

Controller 中的 cgroup 按照hierarchy来排列. Hierarchy 通过在 cgroupfs 中创建、删除、重命名子目录中来定义. 每个层级的 hierarchy 都可以定义 attributes(例如 limits). Cgroup 所提供的 limits, control 和 accounting 一般在组下的整个子结构中都会起作用. 因此, 在结构中高的 cgroup 层级中定义的 limits, 它下面的 cgroup 都不会超过这个 limits.

Cgroups 版本 1 和版本 2

Cgroups 的实现最早发布在 linux 2.6.24 中. 随着时间的推移, 各种 cgroup controllers 被添加, 允许管理各种类型的资源. 然而这些 controllers 的开发是很不协调的, 结果就是在 controller 之间有很多不一致的地方, 而且管理 cgroup 层级结构变得非常复杂.(关于这个问题有一个更长的描述, 可以在 kernel 的源码 Documentation/cgroup-v2.txt 中找到.)

因为这个最初实现(cgroup version 1)所带来的问题, 从 Linux 3.10 开始, 同时在写一个新的实现来补救这些问题. 最开始标记为实验性, 而且隐藏在 -o __DEVEL__sane_behavior mount 选项中, 新版本(cgroups version 2)最终在 Linux 4.5 中发布. 两个版本的差异将在下文中描述.

尽管 cgroups v2 是为了替代掉 cgroups v1 的, 但是老的系统依旧存在(而且由于兼容性的原因, 也不太可能删除). 当前, cgroups v2 只实现了 cgroups v1 中的一部分 controllers. 两个系统都已实现了, 所以你可以在同一个系统中同时挂载 v1 controller 和 v2 controller. 因此, 可以在 version 2 支持的 controller 的同时, 使用 version 1 支持但是 version 2 不支持的 controller. 唯一的限制就是一个 controller 不能同时在 cgroup v1 hierarchy 和 cgroup v2 hierarchy 使用.

CGROUPS VERSION 1

在 cgroups v1 下, 每个 controller 都 mount 在系统中单独的 cgroupfs 下, 提供它所拥有的进程的体系结构. 将多个 cgroups v1 controller(甚至是所有的 controller)同时 mount 在一个 cgroupfs 中也是可以的, 这意味着所有被挂载的 controller 被同一个进程的体系结构管理着.

对于每个挂载过的体系结构, 文件夹树对应着 cgroup 体系结构(control group hierarchy). 每个 cgroup 由一个文件夹表示, 同时它的子 cgroup 表示为子文件夹. 举例, /user/joe/1.session表示有一个 control group 1.session, 是 cgroupjoe的 child, joe是`child. 在每个 cgroup 文件夹下是一组文件, 我们可以读写它, 可以影响到资源的限制和一些通用的 cgroup 属性.

Tasks (threads) versus processes

在 cgroups v1中

CGROUPS VERSION 2

CGROUPS VERSION 2 THREAD MODE

ERRORS

NOTES