控制群组(control group)(在此指南中简写为 cgroup)是 Linux kernel 的一项功能:在一个系统中运行的层级制进程组,您可对其进行资源分配(如 CPU 时间、系统内存、网络带宽或者这些资源的组合)。通过使用 cgroup,系统管理员在分配、排序、拒绝、管理和监控系统资源等方面,可以进行精细化控制。硬件资源可以在应用程序和用户间智能分配,从而增加整体效率。
控制群组可对进程进行层级式分组并标记,并对其可用资源进行限制。传统情况下,所有的进程分得的系统资源数量相近,管理员用进程 niceness 值进行调节。而用此方法,包含大量进程的应用程序可以比包含少量进程的应用程序获得更多资源,这与应用程序的重要程度无关。
为了管理资源,cgroups引入了几个核心概念,它们共同构成了cgroups的组织结构:
-
任务(task):在cgroups中,一个任务就是指系统里的一个进程。
-
控制组(cgroup) :这是cgroups的核心。它代表按照某种资源控制标准划分而成的一个进程组。资源限制就是以控制组为单位生效的。例如,我们可以创建一个名为
mycontainer的控制组,并规定这个组里的所有进程最多只能使用1个CPU核心和1GB内存。 -
子系统(subsystem) :子系统就是具体的资源控制器 。每个子系统负责控制一种特定的资源。比如
cpu子系统控制CPU时间分配,memory子系统控制内存使用量。 -
层级(hierarchy):控制组可以组织成树状结构,这就是层级。一个层级通过绑定一个或多个子系统,来对树中的控制组进行资源调度。子节点控制组会继承父节点的属性。
1、资源管控器
资源管控器(也称为 cgroup 子系统)代表一种单一资源:如 CPU 时间或者内存。Linux kernel 提供一系列资源管控器,由 systemd 自动挂载。如需参考目前已挂载的资源管控器列表,请参见 /proc/cgroups,或使用 lssubsys 监控工具。
root@Anolis2 \~\]# more /proc/cgroups #subsys_name hierarchy num_cgroups enabled cpuset 11 5 1 cpu 9 54 1 cpuacct 9 54 1 blkio 3 54 1 memory 7 81 1 devices 2 54 1 freezer 13 5 1 net_cls 6 5 1 perf_event 4 5 1 net_prio 6 5 1 hugetlb 12 5 1 pids 10 67 1 ioasids 5 1 1 rdma 8 5 1 或者 \[root@Anolis2 \~\]# ls /sys/fs/cgroup/ blkio cpuacct cpuset freezer ioasids net_cls net_prio pids systemd cpu cpu,cpuacct devices hugetlb memory net_cls,net_prio perf_event rdma 详细介绍: • blkio ------ 对输入 ∕ 输出访问存取块设备设定权限; • cpu ------ 使用 CPU 调度程序让 cgroup 的任务可以存取 CPU。它与 cpuacct 管控器一起挂载在同一 mount 上; • cpuacct ------ 自动生成 cgroup 中任务占用 CPU 资源的报告。它与 cpu 管控器一起挂载在同一 mount 上; • cpuset ------ 给 cgroup 中的任务分配独立 CPU(在多芯系统中)和内存节点; • devices ------ 允许或禁止 cgroup 中的任务存取设备; • freezer ------ 暂停或恢复 cgroup 中的任务; • memory ------ 对 cgroup 中的任务可用内存做出限制,并且自动生成任务占用内存资源报告; • net_cls ------ 使用等级识别符(classid)标记网络数据包,这让 Linux 流量控制器(tc 指令)可以识别来自特定 cgroup 任务的数据包; • perf_event ------ 允许使用 perf 工具来监控 cgroup; • hugetlb ------ 允许使用大篇幅的虚拟内存页,并且给这些内存页强制设定可用资源量。
下载内核文档
root@Anolis2 memory\]# yum install kernel-doc \[root@Anolis2 memory\]# ls -l /usr/share/doc/kernel-doc-4.18.0-553.111.1.el8_10/Documentation/cgroup-v1/ 总用量 180 -r--r--r-- 1 root root 939 2月 28 13:10 00-INDEX -r--r--r-- 1 root root 15532 2月 28 13:10 blkio-controller.txt -r--r--r-- 1 root root 26828 2月 28 13:10 cgroups.txt -r--r--r-- 1 root root 1972 2月 28 13:10 cpuacct.txt -r--r--r-- 1 root root 37865 2月 28 13:10 cpusets.txt -r--r--r-- 1 root root 4370 2月 28 13:10 devices.txt -r--r--r-- 1 root root 4909 2月 28 13:10 freezer-subsystem.txt -r--r--r-- 1 root root 1714 2月 28 13:10 hugetlb.txt -r--r--r-- 1 root root 8119 2月 28 13:10 memcg_test.txt -r--r--r-- 1 root root 37701 2月 28 13:10 memory.txt -r--r--r-- 1 root root 1267 2月 28 13:10 net_cls.txt -r--r--r-- 1 root root 2513 2月 28 13:10 net_prio.txt -r--r--r-- 1 root root 3108 2月 28 13:10 pids.txt -r--r--r-- 1 root root 4410 2月 28 13:10 rdma.txt
|------------------------|----------------------------------------|
| cgroups.txt | cgroup-v1 总纲(基础概念、挂载、使用方法) |
| memory.txt | 内存控制组(MemCG) 完整文档(限制进程内存、缓存、OOM 等) |
| cpusets.txt | CPU 核心绑定(指定进程只能用哪些 CPU 核心) |
| blkio-controller.txt | 磁盘 I/O 限速(限制读写速度) |
| devices.txt | 设备权限控制(允许 / 禁止进程访问硬件) |
测试:
首先进入cpu子系统对应的层级路径下:cd /sys/fs/cgroup/cpu/
通过新建文件夹创建一个cpu控制族群:mkdir cg1,即新建了一个cpu控制族群:cg1
新建cg1之后,可以看到目录下自动建立了相关的文件,这些文件是伪文件。我们的测试示例主要用到cpu.cfs_period_us和cpu.cfs_quota_us两个文件。
cpu.cfs_period_us:cpu分配的周期(微秒),默认为100000。
cpu.cfs_quota_us:表示该control group限制占用的时间(微秒),默认为-1,表示不限制。如果设为50000,表示占用50000/10000=50%的CPU。
这里,我们设置占用30%的CPU,即把cpu.cfs_quota_us设置为30000。

编写测试脚本

运行后top查看,可以看到cpu占用100%

将该进程放到新建的control group中,
root@Anolis2 \~\]# echo 4012 \> /sys/fs/cgroup/cpu/cg1/tasks
其实就把该进程号4012写入到control group的tasks文件中再次查看top命令执行情况:

可以看到cpu.sh程序占用的cpu控制在30%左右。