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 功能及组成
CGroup 是将任意进程进行分组化管理的 Linux 内核功能。CGroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。这些具体的资源管理功能称为 CGroup 子系统或控制器。CGroup 子系统有控制内存的 Memory 控制器、控制进程调度的 CPU 控制器等。运行中的内核可以使用的 Cgroup 子系统由/proc/cgroup 来确认。
CGroup 提供了一个 CGroup 虚拟文件系统,作为进行分组管理和各子系统设置的用户接口。要使用 CGroup,必须挂载 CGroup 文件系统。这时通过挂载选项指定使用哪个子系统。
- CGroup 支持的文件种类
表 1. CGroup 支持的文件种类
文件名 | R/W | 用途 |
---|---|---|
Release_agent |
RW |
删除分组时执行的命令,这个文件只存在于根分组 |
Notify_on_release |
RW |
设置是否执行 release_agent。为 1 时执行 |
Tasks |
RW |
属于分组的线程 TID 列表 |
Cgroup.procs |
R |
属于分组的进程 PID 列表。仅包括多线程进程的线程 leader 的 TID,这点与 tasks 不同 |
Cgroup.event_control |
RW |
监视状态变化和分组删除事件的配置文件
|
- CGroup 相关概念解释
-
任务(task)。在 cgroups 中,任务就是系统的一个进程;
-
控制族群(control group)。控制族群就是一组按照某种标准划分的进程。Cgroups 中的资源控制都是以控制族群为单位实现。一个进程可以加入到某个控制族群,也从一个进程组迁移到另一个控制族群。一个进程组的进程可以使用 cgroups 以控制族群为单位分配的资源,同时受到 cgroups 以控制族群为单位设定的限制;
-
层级(hierarchy)。控制族群可以组织成 hierarchical 的形式,既一颗控制族群树。控制族群树上的子节点控制族群是父节点控制族群的孩子,继承父控制族群的特定的属性;
-
子系统(subsystem)。一个子系统就是一个资源控制器,比如 cpu 子系统就是控制 cpu 时间分配的一个控制器。子系统必须附加(attach)到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都受到这个子系统的控制。
【备注】
子系统是根据cgroup对任务的划分功能将任务按照一种指定的属性划分成的一个组,主要用来实现资源的控制。在cgroup中,划分成的任务组以层次结构的形式组织,多个子系统形成一个数据结构中类似多根树的结构。cgroup包含了多个孤立的子系统,每一个子系统代表单一的资源,目前,redhat默认支持10个子系统,但默认只挂载了8个子系统,ubuntu 12.04 默认支持8个子系统,但默认只挂载了5个子系统。
下面对每一个子系统进行简单的介绍:
-
blkio设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb等等。【block io】
-
cpu使用调度程序为cgroup任务提供cpu的访问。
-
cpuacct产生cgroup任务的cpu资源报告。
-
cpuset如果是多核心的cpu,这个子系统会为cgroup任务分配单独的cpu和内存。
-
devices允许或拒绝cgroup任务对设备的访问。
-
freezer暂停和恢复cgroup任务。
-
memory设置每个cgroup的内存限制以及产生内存资源报告。
-
net_cls标记每个网络包以供cgroup方便使用。
-
ns名称空间子系统。
-
perf_event增加了对每group的监测跟踪的能力,即可以监测属于某个特定的group的所有线程以及 运行在特定CPU上的线程,此功能对于监测整个group非常有用,具体参见 http://lwn.net/Articles/421574/
相互关系
-
每次在系统中创建新层级时,该系统中的所有任务都是那个层级的默认 cgroup(我们称之为 root cgroup,此 cgroup 在创建层级时自动创建,后面在该层级中创建的 cgroup 都是此 cgroup 的后代)的初始成员;
-
一个子系统最多只能附加到一个层级;
-
一个层级可以附加多个子系统;
-
一个任务可以是多个 cgroup 的成员,但是这些 cgroup 必须在不同的层级;
-
系统中的进程(任务)创建子进程(任务)时,该子任务自动成为其父进程所在 cgroup 的成员。然后可根据需要将该子任务移动到不同的 cgroup 中,但开始时它总是继承其父任务的 cgroup。
图 1 所示的 CGroup 层级关系显示,CPU 和 Memory 两个子系统有自己独立的层级系统,而又通过 Task Group 取得关联关系。
- CGroup 特点
-
在 cgroups 中,任务就是系统的一个进程。
-
控制族群(control group)。控制族群就是一组按照某种标准划分的进程。Cgroups 中的资源控制都是以控制族群为单位实现。一个进程可以加入到某个控制族群,也从一个进程组迁移到另一个控制族群。一个进程组的进程可以使用 cgroups 以控制族群为单位分配的资源,同时受到 cgroups 以控制族群为单位设定的限制。
-
层级(hierarchy)。控制族群可以组织成 hierarchical 的形式,既一颗控制族群树。控制族群树上的子节点控制族群是父节点控制族群的孩子,继承父控制族群的特定的属性。
-
子系统(subsytem)。一个子系统就是一个资源控制器,比如 cpu 子系统就是控制 cpu 时间分配的一个控制器。子系统必须附加(attach)到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都受到这个子系统的控制。
图 2. CGroup 典型应用架构图
如图 2 所示,CGroup 技术可以被用来在操作系统底层限制物理资源,起到 Container 的作用。图中每一个 JVM 进程对应一个 Container Cgroup 层级,通过 CGroup 提供的各类子系统,可以对每一个 JVM 进程对应的线程级别进行物理限制,这些限制包括 CPU、内存等等许多种类的资源。下一部分会具体对应用程序进行 CPU 资源隔离进行演示。
[实例参见]http://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html
不过在开始实例之前首先安装cgroup
ubuntu14.04 安装 sudo apt-get install cgroup-bin
查看系统支持的子系统类型数量: $ cd /proc
$ lssubsys
挂载的子系统在/sys/fs/cgroup/
e.g.
1.在memory下面建立一个test. #mkdir test
在该文件夹内会自动生成好多文件
详细介绍在http://www.tuicool.com/articles/ArimMz
然后将一个线程写入tasks中,就可以对该线程进行memory管控了。
echo pid >> tasks;
【参考】
1.http://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html
2.http://my.oschina.net/cloudcoder/blog/424418?p=1
子系统是根据cgroup对任务的划分功能将任务按照一种指定的属性划分成的一个组,主要用来实现资源的控制。在cgroup中,划分成的任务组以层次结构的形式组织,多个子系统形成一个数据结构中类似多根树的结构。cgroup包含了多个孤立的子系统,每一个子系统代表单一的资源,目前,redhat默认支持10个子系统,但默认只挂载了8个子系统,ubuntu 12.04 默认支持8个子系统,但默认只挂载了5个子系统。