CGroup简介
CGroup是 Control Groups 的简称,通俗的来说,cgroups 可以限制、记录、隔离进程组所使用的物理资源(包括:CPU、memory、IO 等),为容器实现虚拟化提供了基本保证,是构建 Docker 等一系列虚拟化管理工具的基石。
CGroup主要有四大功能:
资源限制(Resource Limitation):cgroups 可以对进程组使用的资源总额进行限制。如设定应用运行时使用内存的上限,一旦超过这个配额就发出 OOM(Out of Memory)。
优先级分配(Prioritization):通过分配的 CPU 时间片数量及硬盘 IO 带宽大小,实际上就相当于控制了进程运行的优先级。
资源统计(Accounting): cgroups 可以统计系统的资源使用量,如 CPU 使用时长、内存用量等等,这个功能非常适用于计费。
进程控制(Control):cgroups 可以对进程组执行挂起、恢复等操作
要了解CGroup,就要了解一些术语:
task(任务), cgroup(控制组),subsystem(子系统),hierarchy(层级树)
task:
task就是表示系统的一个进程。
cgroup:
资源控制的单位,表示一整个任务组,每个任务组被划分相应的资源,包含了一个或者多个子系统。一个任务既可以加入到这个 cgroup 中,也可以迁移到另外一个 cgroup 中去。
subsystem:
一个资源调度器(Resource Controller,控制着CPU,内存,访问,输入输出等资源和权限。
hierarchy:
一种操作系统的组织结构,可以理解为是一个 cgroup 树,将 cgroup 串成树状结构,通过虚拟端口暴露给用户。
subsystem
子系统是 cgroup 对进程组进行资源控制的具体行为,通过不同的子系统调控资源的调动,subsystem 按照某种对应关系附加到 hierarchy 上, cgroup 提供统一的洪湖街口,使得 cgroup 在上层是一个统一的框架,而在下层实现各种资源的控制,具体子系统 有如下几种:
-
cpu子系统:该子系统为每个进程组设置一个使用CPU的权重值,以此来管理进程对cpu的访问。
-
cpuset子系统:对于多核cpu,该子系统可以设置进程组只能在指定的核上运行,并且还可以设置进程组在指定的内存节点上申请内存。
-
cpuacct子系统:该子系统只用于生成当前进程组内的进程对cpu的使用报告。
-
memory子系统:该子系统提供了以页面为单位对内存的访问,比如对进程组设置内存使用上限等,同时可以生成内存资源报告
-
blkio子系统:该子系统用于限制每个块设备的输入输出。首先,与CPU子系统类似,该系统通过为每个进程组设置权重来控制块设备对其的I/O时间;其次,该子系统也可以限制进程组的I/O带宽以及IOPS。
-
devices子系统:通过该子系统可以限制进程组对设备的访问,即该允许或禁止进程组对某设备的访问。
-
freezer子系统:该子系统可以使得进程组中的所有进程挂起。
-
net-cls子系统:该子系统提供对网络带宽的访问限制,比如对发送带宽和接收带宽进程限制。
hierarchy
cgroup 是一个进程组,最开始可能所有进程都在一个进程组中,然后根据对于资源需求的不同,逐渐分出子进程组,然后根据资源,继续细分,最后变成一个 cgroup 层级结构。
组织结构
在上面对于各组件的简介基本上已经可以看出不同组件之间的联系,以下是各组件之间的联系规则:
- 同一个 hierarchy 可以附加一个或多个 subsystem,如图:
2. 一个 subsystem 可以附加到多个 hierarchy,当且仅当这个 hierarchy 只有这一个subsystem ,如下图,因为 hierarchy 2 中已有一个 subsystem ,所有 hierarchy 中的 subsystem 不能附加到 hierarchy 2 中去:
3. 一个 task 不能属于同一个 hierarchy 的不同 cgroup:
- fork 出的子进程在初始状态与其父进程处于同一个 cgroup。进程(task)在 fork 自身时创建的子任务(child task)默认与原 task 在同一个 cgroup ,但之后这个子任务可以被移动到其他的 cgroup 中去,可以理解为这个子任务是独立的一个进程,如图: