Linux 内核中 cgroup(控制组) 作用是什么?


cgroup(Control Groups) 是 Linux 内核提供的一种机制,用于对 进程(或线程)组 进行资源限制、优先级分配、统计监控和任务控制。通过将进程分组管理,可以实现对 CPU、内存、磁盘 I/O、网络等系统资源的精细化分配和隔离。它是现代容器技术(如 Docker、Kubernetes)的底层核心组件之一。


1. cgroup 的核心目标

  1. 资源限制:限制进程组使用的资源量(如 CPU 最大使用率、内存上限)。
  2. 优先级控制:为不同进程组分配不同的资源权重(如 CPU 调度优先级)。
  3. 资源统计:监控进程组的资源使用情况(如内存消耗、CPU 时间)。
  4. 任务控制:冻结、恢复或终止一组进程。

2. cgroup 的核心概念

2.1 层级树(Hierarchy)
  • cgroup 以树形结构组织,每个层级树(hierarchy)可以关联一个或多个子系统(如 cpumemory)。
  • 每个层级树独立管理资源,子 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 的工作原理

  1. ** 创建层级树**
    管理员挂载一个 cgroup 层级树到文件系统(如 /sys/fs/cgroup),并指定关联的子系统。

    mount -t cgroup -o cpu,memory cgroup /sys/fs/cgroup/cpu_mem
    
  2. ** 创建子 cgroup**
    在层级树中创建子目录,即生成一个子 cgroup。每个子目录包含该子系统的控制文件。

    mkdir /sys/fs/cgroup/cpu_mem/my_group
    
  3. ** 配置资源限制**
    通过写入控制文件设置资源限制。例如,限制内存最大使用量为 1GB:

    echo 1G > /sys/fs/cgroup/cpu_mem/my_group/memory.limit_in_bytes
    
  4. 绑定进程
    将进程 PID 写入 taskscgroup.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 控制 cpucpuacct 分离 统一通过 cpu 控制,支持权重和上限
默认启用 旧版内核默认 Linux 4.5+ 内核默认支持

5. 使用场景

  1. ** 容器资源管理**
    Docker、Kubernetes 使用 cgroup 实现容器的 CPU、内存、I/O 资源隔离。

    docker run --cpus=2 --memory=1g my_image
    
  2. 多租户环境
    在云计算中,为不同租户分配资源配额,避免资源抢占。

  3. ** 高优先级任务**
    为关键进程分配更多 CPU 时间或内存,确保服务质量(QoS)。

  4. 资源统计与监控
    统计进程组的资源使用情况(如 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. 注意事项

  1. 权限管理:修改 cgroup 需要 root 权限或 CAP_SYS_ADMIN 能力。
  2. 资源竞争:过度限制可能导致进程饥饿或 OOM(内存溢出)被杀死。
  3. 版本兼容性:cgroup v1 和 v2 部分功能不兼容,需注意内核版本。
  4. 性能开销:复杂的层级和频繁的资源检查可能引入轻微性能损耗。

8. 总结

cgroup 是 Linux 内核实现 资源管理与隔离 的核心机制,通过层级树、子系统和任务绑定,为容器、虚拟化、多租户等场景提供了底层支持。结合 cpusetcpumemory 等子系统,可以精细控制进程的资源使用边界,是现代云计算和分布式系统的基石之一。

你可能感兴趣的:(Linux 内核中 cgroup(控制组) 作用是什么?)