容器-cgroups概述
CGroups 全称为 Linux Control Group,其作用是限制一组进程使用的资源(CPU、内存等)上限,CGroups 也是 Containerd 容器技术的核心实现原理之一,首先我们需要先了解几个 CGroups 的基本概念:
- Task: 在 cgroup 中,task 可以理解为一个进程,但这里的进程和一般意义上的操作系统进程不太一样,实际上是进程 ID 和线程ID 列表。
- CGroup: 即控制组,一个控制组就是一组按照某种标准划分的
Tasks,可以理解为资源限制是以进程组为单位实现的,一个进程加入到某个控制组后,就会受到相应配置的资源限制。 - Hierarchy: cgroup 的层级组织关系,cgroup 以树形层级组织,每个 cgroup 子节点默认继承其父 cgroup
节点的配置属性,这样每个 Hierarchy 在初始化会有 root cgroup。 - Subsystem: 即子系统,子系统表示具体的资源配置,如CPU使用,内存占用等,Subsystem附加到Hierarchy上后可用。
- CGroups 支持的子系统包含以下几类,即为每种可以控制的资源定义了一个子系统:
cpuset: 为 cgroup 中的进程分配单独的 CPU 节点,即可以绑定到特定的 CPU
- cpu: 限制 cgroup 中进程的 CPU 使用份额
- cpuacct: 统计 cgroup 中进程的 CPU 使用情况
- memory: 限制 cgroup 中进程的内存使用,并能报告内存使用情况
- devices: 控制 cgroup 中进程能访问哪些文件设备(设备文件的创建、读写)
- freezer: 挂起或恢复 cgroup 中的 task
- net_cls: 可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic contro)对数据包进行控制
- blkio: 限制 cgroup 中进程的块设备 IO
- perf_event: 监控 cgroup 中进程的 perf 时间,可用于性能调优 hugetlb: hugetlb 的资源控制功能
- pids: 限制 cgroup 中可以创建的进程数
- net_prio: 允许管理员动态的通过各种应用程序设置网络传输的优先级
通过上面的各个子系统,可以看出使用 CGroups 可以控制的资源有: CPU、内存、网络、IO、文件设备等。CGroups 具有以下几个特点:
CGroups 的 API 以一个伪文件系统(/sys/fs/cgroup/)的实现方式,用户的程序可以通过文件系统实现 CGroups 的组件管理
CGroups 的组件管理操作单元可以细粒度到线程级别,用户可以创建和销毁 CGroups,从而实现资源载分配和再利用
所有资源管理的功能都以子系统(cpu、cpuset 这些)的方式实现,接口统一子任务创建之初与其父任务处于同一个 CGroups 的控制组’
我们可以通过查看 /proc/cgroups 文件来查找当前系统支持的 CGroups 子系统: