最近因为项目原因,发现对于cgroup的知识严重匮乏,所以恶补了一下cgroup的相关知识。
cgroup指对进程进行分组,然后控制让他们的cpu,io以及memory的使用,和系统的性能息息相关。
一、首先是cgroup的整体框架图:
以上框图可以看出以下几点:
1. cgroup的subsys分为很多种,主要有:
acct:进行CPU资源的统计
cpuset:主要用来色值进程跑在哪个核上面
cpuctrl:主要用来设置进程在CPU上的运行时间,起作用的为cpu.shares
blkio:主要用来设置不同进程的IO量占比,可以设置为权重和绝对值两种
memory:主要用来设置进程的memory占用的最高值。
2. 每个子系统下面分为多个cgroup,以Android memory cgroup为例,其层次结构如下:
首先其hierarchy为2(具体为什么为2没搞明白,按照理解,root为第一层,system/app为第二层,uid为第三层,pid为第四层),两层的话应该为root和system/apps两层。
其他cpu分组可以分为前后台进程占用的cpu时间,或者cpu大小核分组。
3. 一个进程对应于一个css_set,css_set又对应于多个子系统
4. 每个process可以属于多个子系统,以对该process进行多种资源的管控。
二、cgroup的初始化:
cgroup的初始化主要是对cgroup子系统进行初始化,最主要的两个函数为:
cgroup_init_early------>用来初始化root cgroup,初始化init_css_set, init_css_set_link这两个全局结构,设置init进程的cgroups指针为init_css_set,同时将一些需要进行early init的subsys进行初始化
int __init cgroup_init_early(void)
{