Linux 内核中 cgroup(控制组) 作用是什么?
cgroup(Control Groups) 是 Linux 内核提供的一种机制,用于对 进程(或线程)组 进行资源限制、优先级分配、统计监控和任务控制。通过将进程分组管理,可以实现对 CPU、内存、磁盘 I/O、网络等系统资源的精细化分配和隔离。它是现代容器技术(如 Docker、Kubernetes)的底层核心组件之一。
1. cgroup 的核心目标
- 资源限制:限制进程组使用的资源量(如 CPU 最大使用率、内存上限)。
- 优先级控制:为不同进程组分配不同的资源权重(如 CPU 调度优先级)。
- 资源统计:监控进程组的资源使用情况(如内存消耗、CPU 时间)。
- 任务控制:冻结、恢复或终止一组进程。
2. cgroup 的核心概念
2.1 层级树(Hierarchy)
- cgroup 以树形结构组织,每个层级树(hierarchy)可以关联一个或多个子系统(如
cpu
、memory
)。 - 每个层级树独立管理资源,子 cgroup 继承父 cgroup 的限制。
2.2 子系统(Subsystem)
- 子系统是具体的资源控制器,每个子系统负责管理一类资源。
- 常见子系统:
子系统 功能 cpu
通过 CFS(完全公平调度器)控制 CPU 时间分配,支持按权重分配 CPU。 cpuacct
统计 CPU 使用时间。 cpuset
绑定进程到指定的 CPU 核心和内存节点(NUMA)。 memory
限制内存使用量,统计内存使用情况,支持 OOM(内存溢出)控制。 blkio
控制块设备(磁盘、SSD)的 I/O 带宽和优先级。 devices
控制进程对设备的访问权限(读/写/创建设备节点)。 freezer
挂起(冻结)或恢复一组进程。 net_cls
标记网络数据包,与流量控制工具(如 tc)配合实现网络带宽限制。
2.3 任务(Task)
- 任务即进程或线程,一个任务可以加入多个 cgroup,但每个子系统层级树中只能属于一个 cgroup。
3. cgroup 的工作原理
-
** 创建层级树**
管理员挂载一个 cgroup 层级树到文件系统(如/sys/fs/cgroup
),并指定关联的子系统。mount -t cgroup -o cpu,memory cgroup /sys/fs/cgroup/cpu_mem
-
** 创建子 cgroup**
在层级树中创建子目录,即生成一个子 cgroup。每个子目录包含该子系统的控制文件。mkdir /sys/fs/cgroup/cpu_mem/my_group
-
** 配置资源限制**
通过写入控制文件设置资源限制。例如,限制内存最大使用量为 1GB:echo 1G > /sys/fs/cgroup/cpu_mem/my_group/memory.limit_in_bytes
-
绑定进程
将进程 PID 写入tasks
或cgroup.procs
文件,加入该 cgroup。echo 1234 > /sys/fs/cgroup/cpu_mem/my_group/cgroup.procs
4. cgroup v1 vs. cgroup v2
特性 | cgroup v1 | cgroup v2 |
---|---|---|
设计目标 | 功能分散,子系统独立管理 | 统一资源管理,简化设计 |
层级树 | 多个层级树,每个关联不同子系统 | 单一层级树,所有子系统统一管理 |
内存控制 | memory 子系统独立 | 内存、Swap、内核内存统一控制 |
CPU 控制 | cpu 和 cpuacct 分离 | 统一通过 cpu 控制,支持权重和上限 |
默认启用 | 旧版内核默认 | Linux 4.5+ 内核默认支持 |
5. 使用场景
-
** 容器资源管理**
Docker、Kubernetes 使用 cgroup 实现容器的 CPU、内存、I/O 资源隔离。docker run --cpus=2 --memory=1g my_image
-
多租户环境
在云计算中,为不同租户分配资源配额,避免资源抢占。 -
** 高优先级任务**
为关键进程分配更多 CPU 时间或内存,确保服务质量(QoS)。 -
资源统计与监控
统计进程组的资源使用情况(如 Prometheus + cAdvisor)。
6. 示例:限制进程 CPU 使用率
# 创建 cgroup
mkdir /sys/fs/cgroup/cpu/my_group# 设置 CPU 时间片权重为 500(默认 1024)
echo 500 > /sys/fs/cgroup/cpu/my_group/cpu.shares# 绑定进程 PID 5678
echo 5678 > /sys/fs/cgroup/cpu/my_group/cgroup.procs
7. 注意事项
- 权限管理:修改 cgroup 需要 root 权限或 CAP_SYS_ADMIN 能力。
- 资源竞争:过度限制可能导致进程饥饿或 OOM(内存溢出)被杀死。
- 版本兼容性:cgroup v1 和 v2 部分功能不兼容,需注意内核版本。
- 性能开销:复杂的层级和频繁的资源检查可能引入轻微性能损耗。
8. 总结
cgroup 是 Linux 内核实现 资源管理与隔离 的核心机制,通过层级树、子系统和任务绑定,为容器、虚拟化、多租户等场景提供了底层支持。结合 cpuset
、cpu
、memory
等子系统,可以精细控制进程的资源使用边界,是现代云计算和分布式系统的基石之一。