cgroup 基本概念分享

cgroup

cgroup 是用来在操作系统中隔离资源的机制,但是应用层几乎无感知,笔者经常执行exec -it,nsenter -n -t进入namespace, 但是对于cgroup 的机制并不了解,cgroup 主要包括子系统(subsystem)、hierarchy(层级)、控制族群(control group)、任务(task)。每次看cgroup的介绍,hierarchy ,control group 的概念让笔者困扰了很久,终于有一天大概懂了,在此记录一下。后续如果有机会还想看下cgroup 的文件系统具体实现。

关系

  1. 每个task 需要加入所有hierarchy
  2. 一个子系统最多只能附加到一个层级;
  3. 一个层级可以附加多个子系统;
  4. 一个任务可以是多个 cgroup 的成员,但是这些 cgroup 必须在不同的层级;
  5. 系统中的进程(任务)创建子进程(任务)时,该子任务自动成为其父进程所在 cgroup 的成员。然后可根据需要将该子任务移动到不同的 cgroup 中,但开始时它总是继承其父任务的 cgroup。

图 1. CGroup 层级图

图1

cgroups层级结构示意图

图2

子系统

一个子系统对应一种操作系统资源,主要包括:

  1. cpu 子系统,主要限制进程的 cpu 使用率。
  2. cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
  3. cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
  4. memory 子系统,可以限制进程的 memory 使用量。
  5. blkio 子系统,可以限制进程的块设备 io。
  6. devices 子系统,可以控制进程能够访问某些设备。
  7. net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
  8. freezer 子系统,可以挂起或者恢复 cgroups 中的进程。
  9. ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace。

层级(hierarchy)

一个 hierarchy 可以与多个子系统对应,但是一个子系统只能与一个hierarchy对应。图二可以看到hierarchy1 对应两个子系统,hierarchy2 对应一个子系统。

控制族群(control group)

从上图可以看到 control group 是hierarchy中组成树的节点,子节点可以默认继承父节点的配置,也可以自定义参数。因此参数非常灵活。

任务(task)

task即一个进程,一个task 需要与每个hierarchy 中的一个节点(控制族群)对应。

cgroup v2

在cgroup v2中一个操作系统中只有一个hierarchy,包含了各种子系统。所以无法与图一、图二有多个hierarchy 的情况对应。

参考

https://www.cnblogs.com/caoxiaojian/p/5633430.html

https://www.cnblogs.com/bincoding/p/16465804.html

https://tech.meituan.com/2015/03/31/cgroups.html

updatedupdated2024-09-292024-09-29