Linux-CGroup

CGroup 笔记


CGroup 简介

CGroup(Control Group) 是 linux 内核提供的一种可以限制、记录、隔离进程组所使用物理资源的机制。

cgroup 把系统中的进程及其将来创建的子进程进行集中和分类,做统一管理。其中,每一个分组就是一个group,每个group可以有多个进程,group对进程的具体控制行为由子系统(subsystem) 来实现,group以树形结构呈现,子group是父group的一个子集,表示对父group中进程的第一步划分


CGroup 功能

cgroups 提供了四大功能:

  • 资源限制:cgroups 可以对任务是要的资源总额进行限制。比如设定任务运行时使用的内存上限,一旦超出就发 OOM。
  • 优先级分配:通过分配的 CPU 时间片数量和磁盘 IO 带宽,实际上就等同于控制了任务运行的优先级。
  • 资源统计:cgoups 可以统计系统的资源使用量,比如 CPU 使用时长、内存用量等。这个功能非常适合当前云端产品按使用量计费的方式。
  • 任务控制:cgroups 可以对任务执行挂起、恢复等操作。

subsystem 子系统

cgroup 对进程的具体控制行为由 子系统(subsystem) 来实现。

每种类型的子系统代表一种系统资源类型,例如cpu ram 磁盘等。

/proc/cgroups 查看支持的子系统

# cat /proc/cgroups
#subsys_name    hierarchy   num_cgroups enabled
cpuset          2           249         1
cpu             6           737         1
cpuacct         6           737         1
blkio           5           20630       1
memory          10          1968        1
devices         12          737         1
freezer         3           249         1
net_cls         4           249         1
perf_event      7           249         1
net_prio        4           249         1
hugetlb         8           249         1
pids            11          249         1
rdma            9           3           1

/proc/cgroups 的内容包含四列,从左到右依次是: 1、subsys_name subsystem 的名字

2、hierarchy subsystem 所关联到的 cgroup树的ID,如果多个subsystem关联到同一颗cgroup树,那么他们的这个字段将一样。 如果出现下面的情况,这个字段将为0: 当前subsystem没有和任何cgroup树绑定 当前subsystem已经和cgroup v2的树绑定 当前subsystem没有被内核开启

3、num_cgroups subsystem 所关联的 cgroup树中进程组的个数,也即树上节点的个数

4、enabled 1表示开启,0表示没有被开启(可以通过设置内核的启动参数“cgroup_disable”来控制subsystem的开启).


创建CGroup

cgroup 相关的所有操作都是基于内核中的 cgroup virtual filesystem,使用 cgroup 很简单,挂载这个文件系统就可以了。一般情况下都是挂载到 /sys/fs/cgroup 目录下,当然挂载到其它任何目录都没关系。