下一代Cgroup——unified hierarchy

Cgroup的管理问题:

一般来说,Cgroup的设计在一般情况下还是没什么问题的,除了操作上的用户体验不是很好,但基本满足我们的一般需求了。

只是有个叫Tejun Heo的同学非常不爽,他在Linux社区里对cgroup吐了一把槽,还引发了内核组的各种讨论。

对于Tejun Heo同学来说,cgroup设计的相当糟糕。他给出了些例子:

大意就是说,如果有多种层级关系,也就是说有多种对进程的分类方式,比如,我们可以按用户来分,分成Professor和Student,同时,也有按应用类似来分的,比如WWW和NFS等。那么,当一个进程即是Professor的,也是WWW的,那么就会出现多层级正交的情况,从而出现对进程上管理的混乱。另外,一个case是,如果有一个层级A绑定cpu,而层级B绑定memory,还有一个层级C绑定cputset,而有一些进程有的需要AB,有的需要AC,有的需要ABC,管理起来就相当不易。

hierarchy may be collapsed from leaf towards root when viewed from specific controllers. For example, a given configuration might not care about how memory is distributed beyond a certain level while still wanting to control how CPU cycles are distributed.

当我们通过指定的控制器来观察时,层级可能会从叶子到根折叠。打个比方,一个配置可能不在意内存如何分配超过一定水平,但想要控制cpu周期分配。

层级操作起来比较麻烦,而且如果层级变多,更不易于操作和管理,虽然那种方式很好实现,但是在使用上有很多的复杂度。你可以想像一个图书馆的图书分类问题,你可以有各种不同的分类,分类和图书就是一种多对多的关系。

总体来说,基于层级的Cgroup就是不灵活,树的深度可能是无限的,这就导致实际操作中管理非常繁琐。

就我个人觉得,上面说的如此复杂的进程管理几乎用不到,上面的场景光管理本身就很复杂了。至于用户体验,封装一下即可。

Unified hierachy特性

不过,基于上述原因,在kernel 3.16中正式加入了unified hierarchy特性,这个特性目前仍然在开发,所以如果想显式开启该特性需要__DEVEL__sane_behavior通过看名字,我们也能发现这个特性仍然在开发。

1 mount -t cgroup -o __DEVEL__sane_behavior cgroup $MOUNT_POINT

在之前的cgroup hierarchy中,我们知道一个hierarchy可以绑定一个子系统,也可以同时绑定12个子系统(越来越多了)。

如果我们开启__DEVEL__sane_behavior特性,我们看到cgroup.controllers 存在的子系统,在unified hierarchy中,系统会把所有子系统都挂载到根层级下,只有leaf节点可以存在tasks,非叶子节点只进行资源控制

1 # mount -t cgroup -o __DEVEL__sane_behavior cgroup /sys/fs/cgroup
2 # cat /sys/fs/cgroup/cgroup.controllers
3 cpuset cpu cpuacct memory devices freezer net_cls blkio perf_event net_prio hugetlb

现在我们在root cgroup下面创建parent与child,根层级的cgroup.subtree_control 控制parents的cgroup.controllers

1 # mkdir /sys/fs/cgroup/parent
2 # mkdir /sys/fs/cgroup/parent/child
3 # echo "+memory +cpu" > /sys/fs/cgroup/cgroup.subtree_control
4 # cat /sys/fs/cgroup/parent/cgroup.controllers
5 cpu memory

如此往复,上级的cgroup.subtree_control控制下级的cgroup.controllers。

如果我指定根层级的cgroup.subtree_control 可以使能memory与cpu两个子系统,也就是说parents中可以控制memory、cpu两个子系统。而child如果没有指定子系统,是不能控制memory与cpu的。

举个例子:

01 # A(b,m) - B(b,m) - C (b)
02 #               \ - D (b) - E
03   
04 # 下面的命令中, +表示enable, -表示disable
05   
06 # 在B上的enable blkio
07 # echo +blkio > A/cgroup.subtree_control
08   
09 # 在C和D上enable blkio
10 # echo +blkio > A/B/cgroup.subtree_control
11   
12 # 在B上enable memory 
13 # echo +memory > A/cgroup.subtree_control

上面的语句中,b代表blkio,m代表memory,A是根,在这个结构中ACD都拥有进程.

比如:

  1. C控制blkio的限制,但是memory不受限,共享B。
  2. E比较特殊,如果没有指定子系统,那么blkio受D限制,memory受B限制。

具体操作方式在上面parents、child已声明。

特点:

  • cgroup只有上级控制下级,本层的cgroup.controllers文件是个只读的,其中的内容就看上级的subtree_control里有什么了。为什么呢?因为比如你想对D限制cpu.share,你把层级挂到D的话,和D平级的C就有问题了,它没法设置权重。所以肯定要挂到父节点。
  • cgroup的文件夹关系是一个包含关系。即,B设置了memory资源配额。那么BCDE共享B的memory资源。CDE其实包含在B中。
  • 只有leaf节点可以存在tasks,非叶子节点只进行资源控制。因此:任何被配置过subtree_control的目录都不能绑定进程,根结点除外。所以,A,C,D,E可以绑上进程,但是B不行。如果该cgroup中已有进程,那么只有在关联的组没有包含进程的时候,cgroup.subtree_control文件能被用来改变控制器的设置。

 总结:

个人理解,这个新的控制方式是,先让cgroup形成一个树,因为Cgroup的资源管理就是一个层次的结构,总体来看就是一颗树。然后往其中的节点来加入子系统,以提供它的下一级资源分配的功能。比如在B中添加了memory层级,C和D的内存配额就可以控制了。

按耗子大叔的说法,这种方式干净的区分开了两个事,一个是进程的分组,一个是对分组的资源控制。确实如此,因为Cgroup代表的是进程分组,子系统用于资源控制。

以上内容参考自:

http://coolshell.cn/articles/17049.html

http://lzz5235.github.io/2015/03/02/cgroup-2.html

http://events.linuxfoundation.org/sites/events/files/slides/2014-KLF.pdf

 

转载请注明:旅途@KryptosX » 下一代Cgroup——unified hierarchy

时间: 2024-10-27 00:57:22

下一代Cgroup——unified hierarchy的相关文章

Docker应用容器基础技术:Linux CGroup 学习教程

虽然你通过Namespace把我Jail到一个特定的环境中去了,但是我在其中的进程使用用CPU.内存.磁盘等这些计算资源其实还是可以随心所欲的.所以,我们希望对进程进行资源利用上的限制或控制.这就是Linux CGroup出来了的原因. Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU.内存.磁盘输入输出等).这个项目最早是由Google的工程师在2006年发起(主要是Paul Menage和Roh

cgroup 术语和规则

cgroup是Linux下用于隔离或管理资源使用的手段.. Redhat有比较详细的介绍. https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/sec-Relationships_Between_Subsystems_Hierarchies_Control_Groups_and_Tasks.html 首先需要了解几个术语,可以帮助理解cgro

阿里内核月报2014年7月-8月

Capsicum for Linux Capsicum: 一种基于文件句柄的新安全模型 Capsicum是一种源自FreeBSD的安全模型,与Linux下众多LSM的相同之处在于它们都是基于权限管理的,而不同之处在于LSM针对的操作对象非常丰富,有进程.VMA.端口.带有标签的文件等等,而Capsicum操作的对象非常单一:文件句柄.例如,一个fd必须带有CAP_READ才能被读取,必须带有CAP_SEEK才能被lseek(),必须带有CAP_MMAP_W才能被mmap()建立可写映射,针对io

《自己动手写Docker》书摘之五: 增加容器资源限制

增加容器资源限制 上一节中,我们已经可以通过命令行mydocker run -ti的方式创建并启动容器,这一节我们将通过Cgroup对容器的资源进行控制. 这一节中我们将实现通过mydocker run -ti -m 100m -cpuset 1 -cpushare 512 /bin/sh的方式控制容器容器的内存和CPU配置. 定义Cgroups的数据结构 上一章中我们介绍了Cgroups包含的三个概念:  cgroup hierarchy中的节点,用于管理进程和subsystem的控制的关系.

Linux的Cgroup

为什么要有cgroup Linux系统中经常有个需求就是希望能限制某个或者某些进程的分配资源.也就是能完成一组容器的概念,在这个容器中,有分配好的特定比例的cpu时间,IO时间,可用内存大小等.于是就出现了cgroup的概念,cgroup就是controller group,最初由google的工程师提出,后来被整合进Linux内核中. Cgroup是将任意进程进行分组化管理的Linux内核功能.cgroup本身提供将进程进行分组化管理的功能和接口的基础结构. 而后的Android操作系统也就凭

cgroup (Control Groups)

在一个服务器上跑多个程序时, 就有可能出现资源争抢到情况, 有没有什么好的方法可以隔离不同进程对各种资源的使用呢? CPU的资源比较好隔离, 例如调整CPU亲和就可以做到, 典型的应用是虚拟机. IO资源的隔离有点困难, 一般的做法是将不同的数据放在不同的物理磁盘上.  内存的隔离也比较简单, 提前分配好就可以了. 但是以上方法太简单粗暴了, 例如内存不提前分配好的话, 怎样限制进程对内存的使用呢? 还有IO的话, 如果多个进程都用到了同样的块设备, 怎么限制单个进程的请求呢? Cgroup很好

CGroup 介绍、应用实例及原理描述

CGroup 介绍 CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制.记录.隔离进程组 (process groups) 所使用的物力资源 (如 cpu memory i/o 等等) 的机制.2007 年进入 Linux 2.6.24 内核,CGroups 不是全新创造的,它将进程管理从 cpuset 中剥离出来,作者是 Google 的 Paul Menage.CGroups 也是 LXC 为实现虚拟化所使用的资源管理手段. CGroup 功能及组

下一代防火墙与传统防火墙、UTM的差别

伴随网络攻击的日渐猖獗,企业面临着如何提升自身安全防护的重要问题,因此部署什么样的防火墙产品就成为企业决策者们需要把控的关键.那么对于传统防火墙.下一代防火墙来说,企业该选择谁呢? 下一代防火墙与传统防火墙.UTM的差别 防火墙(Firewall),也称防护墙,一般是指一种位于内部网络与外部网络之间的网络安全系统.设置防火墙目的是为了在内部网与外部网之间设立唯一通道,简化网络安全管理,防止不合法的访问. 传统防火墙具有数据包过滤.网络地址转换(NAT).协议状态检查以及VPN功能等功能,但传统防

cgroup测试存储设备IOPS分配

1 使用:创建树并且attach子系统 首先要创建文件系统的挂载点作为树的根 mkdir /cgroup/name mkdir /cgroup/cpu_and_mem Mount这个挂载点到一个或者多个子系统  mount -t cgroup -o subsystems name /cgroup/name  mount -t cgroup -o cpu,cpuset,memory cpu_and_mem /cgroup/cpu_and_mem 这个时候查看子系统  ~]# lssubsys -a