1、什么是CGroups?
CGroups 是 Linux 内核提供的一种限制进程所使用资源的机制,全称为 Control Groups , 使用者可以通过 CGroups 对进程所使用的cpu,内存等资源实现精细化的控制与限制,比如说可以限定某个进程的CPU使用数为1,内存使用量不超过1G,从而实现了进程级别的资源物理隔离,充分利用物理机的资源。基于这一特性,很多虚拟技术都在底层使用了 CGroups 来进行实现,比如 LXC , Docker ,systemd等等。
2、CGroups 是如何实现物理资源隔离的?
CGroups 通过实现 VFS 接口,提供一种虚拟文件结构的操作方式来限定进程所能使用的物理资源,屏蔽了具体实现细节,使用者可以比较直观的通过类文件操作的方式来实现进程的资源分组隔离。如下是一个典型的CGroups典型应用架构图:
2.1 任务(Task)
任务,及系统中的一个进程,为系统中具体执行的载体。
2.2 子系统(SubSystem)
子系统为可以控制的资源,如CPU、Memory、IO等,常见子系统有:
- cpu 子系统,主要限制进程的 cpu 使用率。
- cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
- cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
- memory 子系统,可以限制进程的 memory 使用量。
- blkio 子系统,可以限制进程的块设备 io。
- devices 子系统,可以控制进程能够访问某些设备。
2.3 控制组(Control Group)
控制组表示的是一组任务和子系统之间的关系,用以界定系统该如何任务进行资源管控。
2.4 层级树(hierarchy)
层级树,一系列 cgroup 组成的树形结构。每个节点都是一个 cgroup,cgroup 可以有多个子节点,子节点默认会继承父节点的属性。
3、使用方法
1、创建层级树、将需要管控的子系统资源附加到层级树
2、在层级树下创建cgroup
3、设定cgroup资源
4、将进程加入到cgroup
4、总结
cgroup 提供了强大的功能,能够让我们控制应用的资源使用情况,也能统计资源使用数据,是容器技术的基础。主要提供如下功能:
- 资源限制(Resource Limitation):cgroups 可以对进程组使用的资源总额进行限制。如设定应用运行时使用内存的上限,一旦超过这个配额就发出 OOM(Out of Memory)。
- 优先级分配(Prioritization):通过分配的 CPU 时间片数量及硬盘 IO 带宽大小,实际上就相当于控制了进程运行的优先级。
- 资源统计(Accounting): cgroups 可以统计系统的资源使用量,如 CPU 使用时长、内存用量等等,这个功能非常适用于计费。
- 进程控制(Control):cgroups 可以对进程组执行挂起、恢复等操作。