控制组(cgroup )是一种以分组形式管理和控制进程使用系统资源的行为的机制。 也就是说,用户在cgroup中将所有进程分组,并对该组整体进行资源的分配和控制。
1 Cgroup的结构cgroup中的每个组都称为进程组,包含多个进程。 最初,系统中所有进程形成一个进程组(根进程组),根据系统对资源的要求,该根进程组被进一步细分为子进程组,子进程组中的进程是规则的这些子过程组很可能继续被进一步细分,最终形成系统中所有过程组具有层次关系的过程组树。 下图:
由于进程组可以进一步划分,因此一个进程可以属于多个进程组,但这些进程组不必位于同一级别。
此外,如果进程组中的进程创建了子进程,则默认情况下该子进程与父进程位于同一进程组中。 也就是说,通过cgroup控制进程组的资源同样也作用于子进程。
2 subsystem cgroup是过程资源管理与控制的统一框架,提供机制(mechanism ),具体策略(policy )由子系统)完成,子系统由cgroup由过程组完成机制和策略是Linux操作系统中典型的设计思想,机制是“提供什么功能”,策略是“如何实现该功能”。
cgroup中的每个子系统具体代表以下类型的资源:
1 ) cpu子系统)此子系统为每个进程组设置使用cpu的权重值,并管理进程对cpu的访问。
2 ) cpuset子系统)对于多核cpu,此子系统可以设置进程组只在指定的内核上运行,也可以设置进程组在指定的内存节点请求内存。
3 ) cpuacct子系统:此子系统仅用于生成当前进程组中的进程使用cpu的报告。
4 )存储器子系统)该子系统可以提供逐页存储器访问,包括对进程组的存储器使用上限设置,并同时生成存储器资源报告
5 ) blkio子系统:此子系统用于限制每个块设备的输入和输出。 首先,与CPU子系统一样,该系统通过为每个进程组设置权重来控制块设备的输入和输出时间。 子系统还可以限制进程组的I/O带宽和IOPS。
6 ) devices子系统)此子系统允许您限制对进程组设备的访问。 这意味着您可以允许或禁止访问进程组设备。
7 ) freezer子系统)该子系统能够挂起进程组中的所有进程。
8 ) net-cls子系统)该子系统提供对网络带宽的访问限制、例如发射带宽、接收带宽的过程限制。
在实现子系统对所属进程组的资源控制时,实现子系统对应的挂钩函数。 该关系与虚拟文件系统相似,VFS提供了统一的用户界面,具体的文件操作通过文件系统(如ext3 )实现挂接函数。 具体关系如下图所示。
从图中可以看出,cgroup在用户状态下提供统一的用户界面,各子系统对资源的控制功能通过其挂接函数实现。 由此,cgroup在上层是统一的框架,在下层可以控制各种各样的资源。 每个子系统的挂钩函数为以下:
1 struct cgroup _ subsys {2struct cgroup _ subsys _ state * (CSS _ alloc ) ) structcgroup *cgrp; 3int(CSS_online ) ) structcgroup *
cgrp); 4 void(*css_offline)(structcgroup *cgrp); 5 void(*css_free)(structcgroup *cgrp); 6 7 int(*can_attach)(structcgroup *cgrp, structcgroup_taskset *tset); 8 void(*cancel_attach)(structcgroup *cgrp, structcgroup_taskset *tset); 9 void(*attach)(structcgroup *cgrp, structcgroup_taskset *tset); 10 void(*fork)(structtask_struct *task); 11 void(*exit)(structcgroup *cgrp, structcgroup *old_cgrp, 12 structtask_struct *task); 13 void(*bind)(structcgroup *root); 14 …… …… 15} 3 cgroup文件系统cgroup在Linux内核中是以文件系统的形式存在的,不过cgroup对应的这种文件系统与proc文件系统类似,都是只存在于内存中的“虚拟”文件系统。既然如此,就可以通过mount命令创建一个cgroup实例。
1$ sudo mount -t cgroup -o memory memory_cgroup /dev/cgroup/即在/dev/cgroup/下创建了一个memory子系统。接下来就可以通过:
1$ cat /proc/filesystems | grep cgroup可看到系统有了cgroup类型的文件系统。
当创建了一个cgroup实例后,对应的挂载点下会有一些文件,这些文件是用户与cgroup进行交互的接口。由于cgroup位于VFS层之下,因此用户可以通过统一的文件操作接口去读取或设置子系统的参数,当然也可以直接使用echo或者cat等命令。
参考:
1.Linux内核文档:
https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt
原文链接:http://edsionte.com/techblog/archives/4314