Cgroup内核框架分析

    Cgroup是linux内核提供的一种可以限制、记录、隔离task(进程或者线程)所使用物理资源的机制,LXC为实现虚拟化使用了Cgroup作为资源管理手段。用户空间使用文件的方式组织和管理Cgroup资源,所有的资源管理都有标准化的subsystem(子系统)实现,在文件 include/linux/cgroup_subsys.h 列出了所有的子系统,subsystem的hook函数通过cgroup附着于进程之上,当进行资源调配的时候可以触发相关的hook函数以达到限制物理资源的目的。

    下图为kernel5.0版本的Cgroup内核框架图

Cgroup内核框架分析_第1张图片

 

    task_struct 是进程描述符的结构体,这里的ccs_set *cgroups成员是task和cgroup的桥梁, cg_list是一个链表的头指针,该链表包含了所有同一css_set下的task进程。一个task对应了唯一的ccs_set,但是一个ccs_set可以对应多个task

    ccs_set的核心成员为struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT],每一个不为空的cgroup_subsys_state组员都有一个子系统struct cgroup_subsys *ss成员(表示task所挂载的子系统)和struct cgroup *cgroup成员,那么一个task对应的所有cgroup都可以找到了。

    再看cgroup结构体,同样有struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]成员表示当前cgroup所挂载的子系统,root指向了所在层级的根cgroup,也就是创建层级时自动创建的那个cgroup。cset_links成员指向了一张链表,该链表链入到cgrp_cset_link结构体,cgroup和css_set是一个多对多的关系,必须添加一个中间结构cgrp_cset_link来将两者联系起来。结构体中cset_link连入到cgroup->cset_links指向的链表,cgrp_link连入到ccs_set->cgrp_links指向的链表,使得不管从cgroup
还是从css_set都可以进行遍历查询。

    下图为ccs_set和cgroup的多对多关系,一个子系统只能挂载于一个cgroup_root之上,一个cgroup可以挂载多个子系统由cgroup_subsys_state指针数组表示,与此同时ccs_set也通过指针数组挂载了多个子系统。

Cgroup内核框架分析_第2张图片

 

 

你可能感兴趣的:(Cgroup内核框架分析)