一些概念
- cgroup:控制组,将一组进程和一个或多个子系统的一组参数关联起来
- subsystem:子系统,即控制器,如memory、cpu,/proc/cgroups可以查看支持的全部子系统,这在内核编译时已经决定
- hierarchy:层级,控制组树,cgroup的每一个挂载点都代表一个层级,一个层级包含所有的进程,并关联一个或多子系统来限制这些进程的资源。
一些结构体
- struct cgroup:控制组cgroup的抽象。
- struct cgroup_root:代表一个 cgroup 层级树(hierarchy)的根,包含层级的属性 。每个层级树都有一个cgroup_root,其中cgrp成员表示该层级的第一个cgroup
- struct cgroup_subsys:简称ss,是子系统(memory、io等控制器)的抽象)
- struct mem_cgroup:具体的资源控制组,每个子系统都有具体的资源控制组,例如cpu_cgroup等,对资源限制的具体数值体现在这类结构体中。一个struct cgroup管理多个具体的资源控制组(struct mem_cgroup等)
- struct cgroup_subsys_state:简称css,是子系统和cgroup之间的连接器,负责将一个子系统和一个cgroup关联起来。css是cgroup以及每一个具体资源控制组(mem_cgroup、cpu_cgroup等)的公共基础部分,内嵌在后者之中,可以通过container_of提取对应的cgroup或者具体的资源控制器(mem_cgroup等)。cgroup的树状结构也是由css中的parent、slibing和children成员维系的。
- struct css_set:css的集合,代表一组进程,这些线程在每个层级(hierarchy)内都属于同一个cgroup。
- struct cgrp_cset_link:代表一个css_set和一个cgroup的映射关系,css_set代表在每个层级上都属于同一cgroup的一组进程,因此该结构体用来表示进程和cgroup之间多对多关系。struct cgroup->cset_links和struct css_set->cgrp_links都是struct cgrp_cset_link链表头。
- css_set维护一个cgrp_cset_link链表css_set->cgrp_links,链表中cgrp_cset_link.cset都指向自身。通过这个链表,可以找到这个css_set(一组进程)在各个层级中所归属的cgroup。
- cgroup同样维护一个cgrp_cset_link链表cgroup->csets_links,通过这个链表可以找到此cgroup下所有进程对应的css_set,进而找到cgroup管理的所有进程。
- struct task_struct:代表一个进程,其cgroup成员指向该进程对应的css_set。
结构体之间的关系
-
一个层级受一个或多个子系统控制,一个层级下包含一个或多个控制组,并构成树状结构,每个层级都包含所有的进程,一个进程在层级中归属于唯一的控制组。
-
同一层级中,每个控制组和每个子系统相关联组成css,这是具体的资源控制组(如mem_cgroup)的内嵌结构,可通过container_of访问具体的资源控制器。
-
与同一个进程相关联的所有css构成一个css_set,进程(struct task_struct)的cgroups成员便指向该css_set。不同进程可以指向相同的css_set,说明它们在每个层级中的所属的控制组都相同。
-
结构体成员之间的指向关系见下图:
-
层级树的组织方式见下图:
创建cgrp_cset_link的过程
- 先预先分配多个struct cgrp_cset_link,并存放在临时链表tmp_links中。每当有进程添加到cgroup时,便从临时链表中取出一个cgrp_cset_link,cgrp和cset成员分别指向此cgroup和进程对应的css_set,然后将其放入cgroup->cset_links链表尾部,再放入css_set->cgrp_links链表尾部。构建起进程和cgroup多对多的关系。
- 上述是allocate_cgrp_cset_links和link_css_set函数的逻辑。