Control Groups (Cgroups) 是 Red Hat Enterprise Linux 6 (以后简称 RHEL6) 提供的一项内核功能。我们可以使用 Cgroups 为任务(进程)分配资源,例如 CPU 时间、系统内存、网络带宽等。我们可以对 Cgroups 进行监控,禁止 Cgroups 控制下的进程访问某些资源,还可以在一个运行中的系统中对 Cgroups 动态地进行配置。cgconfig ( control group config ) 是一项系统服务,它可以根据配置文件创建 Cgroups,我们可以通过它在每次重启操作系统之后保持一致的 Cgroups 配置。
Cgroups 的组织结构为层次体系,类似于进程,子 Cgroups 继承上一级的属性。Cgroups 可以有多个单独的层次结构,每个层次结构关联一个或多个子系统。一个子系统表示一个单一的资源,如 CPU 时间或内存。RHEL6 提供了以下 9 个子系统:
* blkio – 该子系统限制块设备的输入输出访问,例如物理驱动器(磁盘、SSD、USB等)。
* cpu – 该子系统调度 cgroup 任务对 CPU 的访问。
* cpuacct – 该子系统生成 cgroup 中的任务使用 CPU 资源的报告。
* cpuset – 该子系统将各个 CPU 和内存节点指定给 cgroup 中的任务。
* devices – 该子系统可以允许或者禁止 cgroup 中的任务访问某个设备。
* freezer – 该子系统暂停或者继续 cgroup 中的任务。
* memory – 该子系统设置 cgroup 中任务对内存的使用限制,并且生成各任务对内存的使用报告。
* net_col – 该子系统使用类标识符 ( classid ) 来标记网络包,以使用 Linux 流量控制 ( tc ) 能够分辨 cgroup 中的特定任务所发出的数据包。
* net_prio – 该子系统可以动态地设置每个网络接口 ( network interface ) 的优先级。
* ns – 命名空间子系统。
关于子系统,Cgroups 层次结构与任务之间的关系,有以下几条规则:
1. A single hierarchy can have one or more subsystems attached to it.
一个层次结构可以关联一个或多个子系统。
2. Any single subsystem cannot be attached to more than one hierarchy if one of those hierarchies has a different subsystem attached to it already.
任何单个子系统不可以被关联到一个以上的层次结构,如果其中一个层次结构已经关系到一个不同的子系统。
3. A task cannot be a member of two different cgroup in the same hierarchy.
一个任务不能同时属于同一个层次结构中的两个 cgroup。
4. A forked task inherits the exact same cgroups as its parent task.
当 cgroups 中的一个任务 fork 出一个新任务时,新任务自动继承其父任务的 cgroup 关系。但是,新任务与父任务之间是完全独立的,新任务可以被移动到其他的 cgroups 。