CGroups
CGroups¶
功能和定位¶
Cgroups全称Control Groups,是Linux内核提供的物理资源隔离机制,通过这种机制,可以实现对Linux进程或者进程组的资源限制、隔离和统计功能。
比如可以通过cgroup限制特定进程的资源使用,比如使用特定数目的cpu核数和特定大小的内存,如果资源超限的情况下,会被暂停或者杀掉。
Cgroup是于2.6内核由Google公司主导引入的,它是Linux内核实现资源虚拟化的技术基石,LXC(Linux Containers)和docker容器所用到的资源隔离技术,正是Cgroup。
相关概念介绍¶
- 任务(task): 在cgroup中,任务就是一个进程。
- 控制组(control group): cgroup的资源控制是以控制组的方式实现,控制组指明了资源的配额限制。进程可以加入到某个控制组,也可以迁移到另一个控制组。
- 层级(hierarchy): 控制组有层级关系,类似树的结构,子节点的控制组继承父控制组的属性(资源配额、限制等)。
- 子系统(subsystem): 一个子系统其实就是一种资源的控制器,比如memory子系统可以控制进程内存的使用。子系统需要加入到某个层级,然后该层级的所有控制组,均受到这个子系统的控制。
概念间的关系:
- 子系统可以依附多个层级,当且仅当这些层级没有其他的子系统,比如两个层级同时只有一个cpu子系统,是可以的。
- 一个层级可以附加多个子系统。
- 一个任务可以是多个cgroup的成员,但这些cgroup必须位于不同的层级。
- 子进程自动成为父进程cgroup的成员,可按需求将子进程移到不同的cgroup中。
cgroup关系图如下:

两个任务组成了一个 Task Group,并使用了 CPU 和 Memory 两个子系统的 cgroup,用于控制 CPU 和 MEM 的资源隔离。
子系统¶
- cpu: 限制进程的 cpu 使用率。
- cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
- cpuset: 为cgroups中的进程分配单独的cpu节点或者内存节点。
- memory: 限制进程的memory使用量。
- blkio: 限制进程的块设备io。
- devices: 控制进程能够访问某些设备。
- net_cls: 标记cgroups中进程的网络数据包,然后可以使用tc模块(traffic control)对数据包进行控制。
- net_prio: 限制进程网络流量的优先级。
- huge_tlb: 限制HugeTLB的使用。
- freezer:挂起或者恢复cgroups中的进程。
- ns: 控制cgroups中的进程使用不同的namespace。
cgroups文件系统¶
Linux通过文件的方式,将cgroups的功能和配置暴露给用户,这得益于Linux的虚拟文件系统(VFS)。VFS将具体文件系统的细节隐藏起来,给用户态提供一个统一的文件系统API接口,cgroups和VFS之间的链接部分,称之为cgroups文件系统。
比如挂在 cpu、cpuset、memory 三个子系统到 /cgroups/cpu_mem 目录下
关于虚拟文件系统机制,见浅谈Linux虚拟文件系统机制
查看 cgroup 子系统挂载点¶
通过命令 mount -t cgroup 就可以查看当前的所有 linux cgroups 子系统与挂载点:

6.2 创建隔离组¶
例如我们要对某一组进程的 cpu 资源进行限制,那么我们就执行:
查看创建后的目录,可以看到,目录中已经生成了一系列文件。
6.3 限制 CPU 利用率¶
接下来我们就可以来对进程进行 CPU 利用率的限制了。
首先我们写一个 C 语言的程序,用来将 CPU 跑到 100%:
运行这个进程,我们观察到 CPU 利用率确实达到了 100%。
接着我们执行下面的命令:
# 限制该组进程 CPU 总利用率到 20%
echo 20000 > /sys/fs/cgroup/cpu/test_limit/cpu.cfs_quota_us
# 向任务控制列表中添加需要被限制的 pid
echo 23732 >> /sys/fs/cgroup/cpu/test_limit/tasks
可以看到,在完成上述命令的执行后,可以看到,cpu 利用率很快就被成功限制到了 20%。
其他资源的限制方法与此是完全类似的