cgroup
cgroup 是用来在操作系统中隔离资源的机制,但是应用层几乎无感知,笔者经常执行exec -it
,nsenter -n -t
进入namespace, 但是对于cgroup 的机制并不了解,cgroup 主要包括子系统(subsystem)、hierarchy(层级)、控制族群(control group)、任务(task)。每次看cgroup的介绍,hierarchy ,control group 的概念让笔者困扰了很久,终于有一天大概懂了,在此记录一下。后续如果有机会还想看下cgroup 的文件系统具体实现。
关系
- 每个task 需要加入所有hierarchy
- 一个子系统最多只能附加到一个层级;
- 一个层级可以附加多个子系统;
- 一个任务可以是多个 cgroup 的成员,但是这些 cgroup 必须在不同的层级;
- 系统中的进程(任务)创建子进程(任务)时,该子任务自动成为其父进程所在 cgroup 的成员。然后可根据需要将该子任务移动到不同的 cgroup 中,但开始时它总是继承其父任务的 cgroup。
子系统
一个子系统对应一种操作系统资源,主要包括:
- cpu 子系统,主要限制进程的 cpu 使用率。
- cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
- cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
- memory 子系统,可以限制进程的 memory 使用量。
- blkio 子系统,可以限制进程的块设备 io。
- devices 子系统,可以控制进程能够访问某些设备。
- net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
- freezer 子系统,可以挂起或者恢复 cgroups 中的进程。
- 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