当前位置: 首页 > news >正文

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 等子系统,可以精细控制进程的资源使用边界,是现代云计算和分布式系统的基石之一。

相关文章:

  • 数据赋能(204)——原则与原理——原理方法
  • 【程序员 NLP 入门】词嵌入 - 上下文中的窗口大小是什么意思? (★小白必会版★)
  • 电容加速电路!
  • 从零开始搭建Django博客②--Django的服务器内容搭建
  • 【2025最新面试Java八股】Java虚拟线程怎么回事,是协程吗?
  • 数智读书笔记系列030《曲折的职业道路:在终身工作时代找准定位》与《做自己的教练:战胜工作挑战掌控职业生涯》
  • 学习笔记:黑马程序员JavaWeb开发教程(2025.3.25)
  • Java高频面试之并发编程-05
  • LDO手册看点
  • 交易所开发:构建高效数字交易枢纽
  • C++与C
  • Redis在SpringBoot中的使用
  • Uniapp:swiper(滑块视图容器)
  • ubuntu20.04 远程桌面Xrdp方式
  • AR/VR衍射光波导性能提升遇阻?OAS光学软件有方法
  • AOSP Android14 Launcher3——RecentsView最近任务数据加载
  • Java面试实战:从Spring Boot到微服务的深入探讨
  • 双周报Vol.70: 运算符重载语义变化、String API 改动、IDE Markdown 格式支持优化...多项更新升级!
  • 用Java实现简易区块链:从零开始的探索
  • 智能电网第1期 | 工业交换机在变电站自动化系统中的作用
  • 中国和阿塞拜疆签署互免签证协定
  • 央行研究局局长答澎湃:持续优化跨境金融服务政策工具箱,有效支持企业走出去
  • 外卖江湖战火重燃,骑手、商家、消费者在“摇摆”什么?
  • 2024年我国数字阅读用户规模达6.7亿
  • 著名政治学学者、中国人民大学教授仝志敏逝世
  • 京东:自21日起,所有超时20分钟以上的外卖订单全部免单