欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > Linux 内核中 cgroup(控制组) 作用是什么?

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

2025/5/9 15:26:50 来源:https://blog.csdn.net/qq_33775774/article/details/147429189  浏览:    关键词: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 v1cgroup 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 等子系统,可以精细控制进程的资源使用边界,是现代云计算和分布式系统的基石之一。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词