cgroup是Control Groups的缩写,是Linux内核提供的一种可以对进程或进程组进行物理资源(如:CPU,内存,设备IO等)限制、隔离和统计的机制。cgroup的用户空间管理是通过cgroup文件系统来实现,得益于Linux的虚拟文件系统,其文件系统的细节被隐藏,用户通过相关的控制文件来实现该功能的使用。
cgroup于2.6内核时期由Google公司主导引入,它是Linux内核实现资源虚拟化的技术基础,是LXC(Linux Containers)和Docker容器的技术基石。cgroup中有如下相关概念:
任务(task):进程的别称;控制组(control group):按照某种标准划分的进程集合。Cgroup中的资源控制都是以控制组为单位来实现。进程可以加入到某个控制组,也可以从一个进程组迁移到另一个控制组中。一个进程组的进程可以使用cgroups以控制组为单位分配的资源,同时受到cgroup以控制组为单位设置的资源限制。层级(hierarchy):控制组的层级关系,采用树的结构方式组织,子节点的控制组继承父节点的资源设置属性。子系统(subsystem):一个子系统就是一种资源控制器,比如cpu子系统可以控制进程CPU使用时间分配,如图1所示。子系统必须附件到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制组都受到这个子系统的控制。Part 02cgroup子系统
(资料图片)
cgroup子系统和内核版本有关,随着内核的迭代,能限制的资源也越来越多,一般包括如下子系统。
➤blkio:对输入/输出访问存取块设备设定限制,比如物理设备(磁盘,固态硬盘,USB等等)。
➤cpu:限制进程的cpu使用,涉及cpu调度时间片分配。
➤cpuacct:自动生成cgroup中任务所使用的cpu报告。
➤cpuset:为cgroup中的任务分配独立cpu(多核系统)和内存节点。
➤devices:允许或者拒绝cgroup中的任务访问设备。
➤freezer:挂起或恢复cgroup中的任务。
➤memory:设定cgroup中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。
➤net_cls:使用等级识别符标记网络数据包,可允许Linux流浪控制程序识别从具体cgroup中生成的数据包。
➤ns:namespace子系统。
Part 03cgroup层级规则结合cgroup层级(hierarchy)可以理解为一颗树,树的每个节点就是一个进程组,每棵树都会与一到多个子系统关联。在一棵树里,会包含Linux系统中的所有进程,但每个进程只能属于一个节点(进程组)。系统中可以有很多颗cgroup树,每棵树都和不同的subsystem关联,一个进程可以属于多棵树,即一个进程可以属于多个进程组,只是这些进程组和不同的子系统关联。目前Linux最多可以建十二颗cgroup树,每棵树关联一个子系统,当然也可以只建一棵树,然后让这棵树关联到所有的子系统。当一颗cgroup树不和任何子系统关联的时候,意味着这棵树只是将进程进行分组,至于要在分组的基础上做些什么,将由应用程序自己决定,systemd就是这样一个例子。
层级的组成规则有四个,描述如下:
规则1:单个层次结构可以具有一个或多个子系统。如图1所示,/cpu_memory_cg这个层级对cgroup1,cgroup2设置了cpu和memory两个子系统。
图1 层级规则1
规则2:如果任何一个子系统已经附加到了一个层次,则不能将他们附加到另一个层次的结构中。如图2所示,层级A的cpu_cg首先管理cpu子系统,那么层级B的cpu_mem_cg就无法管理cpu子系统。
图2 cgroup层级规则2
规则3:每次在系统上创建新的层次结构时,系统上的所有任务最初都是该层次结构的默认cgroup(称为根cgroup)成员。对于创建的任何单个层次结构,系统上的每个任务都可以是该层次结构中的一个cgroup成员。一个任务可以位于多个cgroup中,只要这些cgroup中的每个处于不同的子系统层次结构中即可。任务一旦成为同一层次结构中的第二个cgroup成员,就会将其从该层次结构中的第一个cgroup中删除,即在同一层次结构中的两个不通cgroup,绝不会有同一任务,也即是对某进程某类cgroup子系统的限制方式只能有一种。创建第一个层次结构时,系统上的每个任务都是至少一个cgroup(根cgroup)的成员,因此,在使用cgroup时,每个系统任务始终至少位于一个cgroup中,如图3所示。
图3 cgroup层级规则3
规则4:系统上派生的任何进程都会创建一个子进程(或线程)。子进程自动继承其父级的cgroup成员资格,但可以根据需要移动到其他cgroup中,移动后父子进程完全独立,如图4所示。
图4 cgroup层级规则4
Part 04cgroup层级关系分析我们从进程的角度出发,结合源码中的数据结构来解析cgroups相关数据之间的关系。首先在Linux中,管理进程的数据结构是task_struct,其中与cgroups有关的成员如下:
其中cgroup指向一个css_set结构,其存储了与进程相关的cgroups信息。cg_list为使用同一个css_set的进程链表。css_set结构如下:
结构体的元素信息解释如下:
refcount是css_set的引用计数,其可以被多个进程共用,只要这些进程的cgroups信息相同。比如,在所有已经创建的层级里面都在同一个cgroup里的进程。hlist用于把所有css_set构建成一个hash表,内核能快速查找特定的css_set。tasks将所有引用此css_set的进程链接成链表。cg_links指向一个由struct cg_group_link组成的链表subsys为一个指针数组,存储一组指向cgroup_subsys_state的指针。一个cgroup_subsys_state就是进程与一个特定的子系统相关的信息。通过这个指针,进程就可以获得相应的cgroups控制信息。接下来我们看一下cgroup_subsys_state结构体情况:
结构体中cgroup指针指向一个cgroup结构,进程受到子系统的资源控制,实际上是通过加入特定的cgroup子系统实现,因为cgroup在特定的层级上,而子系统又是附加到层级上的。
我们来看看cgroup的结构,
sibling,children和parent三个链表负责将同一层级的cgroup连接成一棵树。susys为之前描述过的子系统指针数组。root指向了一个cgroupfs_root的结构,就是cgroup所在的层级对应的结构体。root->top_cgroup指向所在层级的根cgroup,也就是幻剑层级时自动创建的那个cgroup。获取层级的根cgroup可以通过cgroup->root->top_cgroup。css_sets指向一个由cg_cgroup_link的链表,和css_set中cg_links一致。为了理清楚css_set和cgroup的关系,我们还需对中间层的cg_cgroup_link结构进行分析,结构体数据如下:
结构体中的数据说明如下:
cgrp_link_list链接到cgroup->css_sets指向的链表。
cgrp则指向此cg_cgroup_link相关的group。
cg_link_list则链接到css_set->cg_links指向的链表。
cg则指向cg_cgroup_link相关的css_set。
可以看出cgroup和css_set实际上是一个多对多的关系,需要添加一个中间结构将两者结合,cg_group_link中的cgrp和cg元素就是结合部,cgrp_link_list和cg_link_list两个链表即为挂接的cgroup和css_set实体,方便轮询。
从cgroup的层级规则中可以看出,一组进程可以同属于不在同一层级的cgroup,相结合理解,一个css_set存储了一组进程根各个子系统相关的信息,子系统来自不通的cgroup层级,因此一个css_set存储的cgroup_subsys_state可以对应多个cgroup。 另一方面,cgroup层级也存储了一组cgroup_subsys_state,其从cgroup所在的层级附加的子系统中获得,一个cgroup可以有多个进程,进程的css_set不一定相同,因为进程可能使用了多个层级,所以一个cgroup也需要对应多个css_set。图5详细描述了多对多的挂接关系。
图5 进程和cgroup多对多关系图
Part 05结语本文在cgroup概念基础上,对其和进程之间多对多的关系进行了拆解,从相关结构体中变量的挂接分析其具体代码实现方式,希望能帮助读者对cgroup层级关系和使用方式有更好的理解。
标签:
精彩推荐
Part01cgroup概述cgroup是ControlGroups的缩写,是Linux内核提供的一种
这是6月4日拍摄的位于内蒙古巴彦淖尔市乌拉特前旗的乌梁素海(无人机照
什么是屏幕支架,什么是屏幕镜像这个很多人还不知道,现在让我们一起来
1、健胃消食片宜饭后服用,主要治疗消化不良、胃脘胀满、疼痛、胀满、嗳气、反酸、烧心等消化不良。吞咽困
1、网站有问题了。2、你可以用360里面的电脑门诊帮你修复下DNS之类的,你遇到什么问题都可以在里面修复或者
1、首先画出可爱动漫少女的头像。2、然后画可爱的动漫少女的眉毛,眼睛,嘴巴。3、然后画出可爱动漫少女的
1、为您奉上: 学海无涯,一年之计春为早;青春有限,千秋大事志当先。2、 一路风雨前程磨砺意志半载
大家好,小万来为大家解答以上的问题。将军与天使,关于将军与天使介绍这个很多人还不知道,现在让我们一起来
1、查询谁有识别码主要有两种方式。2、一种是比较直观的查询,根据规定,享受了税收优惠的保险上面必须印有
想必现在有很多小伙伴对于怎样玩地狱使者重返人间2方面的知识都比较想要了解,那么今天小好小编就为大家收
当地时间5月28日,美国总统拜登表示,与众议院共和党籍议长麦卡锡就提高债务上限达成的最终协议正在提交给
1、网上赚钱的方式有很多种,目前我所知道的有:开淘宝店,卖东西;2、淘宝刷分,此类风险高,易上手;3、
坐月子期间可以喝黄芪鸡汤或者红枣鸡汤,也可以喝乌鸡汤或者鸽子汤,都是比较有营养的,有利于促进因为怀孕
据新华社报导,近日,由于遭遇阴雨天气,河南、陕西、江苏等地麦收受到影响。记者瞭解到,各地正在加紧进行
一项新研究为健康饮食的必要性增加了新砝码:瑞典乌普萨拉大学科研人员发现,高脂高糖饮食会改变深度睡眠时
近日,湖北南漳警方成功捣毁了一个制贩假药团伙,涉案金额达5000余万元;这些人将淀粉和柠檬酸,混合后制成
今天小红来为大家带来的是人人车和瓜子哪个卖车好,人人车与瓜子二手车直卖网哪个比较靠谱,让我们一起往下
今天小红来为大家带来的是vivo如何恢复出厂设置手机后忘记账号密码,vivo如何恢复出厂设置,让我们一起往下
1、成分相同(聚乙烯醇)。2、就聚合度不同。3、固体的聚合度高。本文到此分享完毕,希望对大家有所帮助。
网络盈利模式是网站为了实现盈利而采用的方式和手段。盈利模式有:广告、会员与增值、交易佣金等。本文到此
资讯News
06-20
11-03
11-03
11-03
11-03
11-03
11-03
11-03
11-03
11-03
11-03
聚焦Policy
当好农民工的“护薪人” 近日,罗某等7名农民工在收到被拖欠的工资后,纷纷打电话向江西省南昌市...
“通讯录里所有人都知道我欠钱了” □ 本报记者 韩丹东 □ 本报见习记者 张守坤 ...
大连宝马车撞人案肇事司机被判死刑 本报讯 记者韩宇 10月29日,辽宁省大连市中级人民法院一审...
医院财务迷上网络赌博输光5000万元公款 □ 本报记者 马维博 □ 本报通讯员 汪宇堂 曹...
辊环车削 雕琢毫厘(工匠绝活) 【绝活看点】 23年来,雷虎始终扎根一线,改进钢材轧制工艺...
交警严查超标电动自行车挪用“白牌” 截至昨晚6时,处罚电动自行车违法行为共计6585笔;下一步将...
明起寒潮来袭 北方气温普降10℃以上 中央气象台预计,本周日北京平原地区最低气温降至-4℃左右...
多种蔬菜价格降幅达五成 包括菠菜、蒿子秆等 预计本月中旬蔬菜恢复供需平衡 本报讯(记者...
北京周日最低气温或达-4℃ 本报讯(记者 赵婷婷)北京青年报记者昨天从中央气象台获悉,新一股...
昌平一家四口确诊新冠肺炎 天通北苑第二社区升级为中风险地区 朝阳两涉疫校区及16所学校停课 ...