插件窝 干货文章 五分钟技术趣谈 | Linux Cgroup层级规则简析

五分钟技术趣谈 | Linux Cgroup层级规则简析

层级 子系统 Cgroup CPU 716    来源:    2025-04-20

Linux Cgroup层级规则简析

什么是Cgroup?

Cgroup(Control Group)是Linux内核提供的一种机制,用于限制、记录和隔离进程组使用的物理资源(如CPU、内存、磁盘I/O等)。它是Linux容器技术(如Docker、LXC)实现资源隔离的基础。

Cgroup层级结构特点

  1. 树状层级结构:Cgroup采用树状层级结构组织,子cgroup继承父cgroup的属性
  2. 单层级规则:每个子系统(如cpu、memory)只能附加到一个层级上
  3. 多层级共存:不同子系统可以附加到不同层级

核心层级规则解析

1. 单子系统单层级规则

每个子系统(如cpu、memory)同一时间只能附加到一个层级上。例如: - cpu子系统不能同时附加到层级A和层级B - memory子系统也不能同时附加到多个层级

2. 多子系统单层级规则

一个层级可以附加多个子系统。例如: - 可以创建一个层级同时附加cpu和memory子系统 - 这样该层级下的cgroup可以同时控制CPU和内存资源

3. 进程单cgroup规则

一个进程在同一子系统中只能属于一个cgroup。例如: - 一个进程不能同时属于cpu子系统的cgroup1和cgroup2 - 但可以属于cpu子系统的cgroup1和memory子系统的cgroupA

实际应用示例

# 创建并挂载一个包含cpu和memory子系统的层级
mkdir /sys/fs/cgroup/cpu_mem
mount -t cgroup -o cpu,memory cpu_mem /sys/fs/cgroup/cpu_mem

# 在该层级下创建子cgroup
mkdir /sys/fs/cgroup/cpu_mem/group1

# 设置CPU限制
echo 100000 > /sys/fs/cgroup/cpu_mem/group1/cpu.cfs_quota_us
echo 100000 > /sys/fs/cgroup/cpu_mem/group1/cpu.cfs_period_us

# 设置内存限制
echo 100M > /sys/fs/cgroup/cpu_mem/group1/memory.limit_in_bytes

# 将进程加入该cgroup
echo $PID > /sys/fs/cgroup/cpu_mem/group1/tasks

常见问题与解决

  1. 无法附加子系统到新层级

    • 检查子系统是否已附加到其他层级
    • 使用cat /proc/cgroups查看子系统状态
  2. 资源限制不生效

    • 确认进程是否已加入正确的cgroup
    • 检查父cgroup的限制是否更严格
  3. 层级结构混乱

    • 遵循单一职责原则,按功能划分层级
    • 避免过度复杂的层级嵌套

总结

理解Cgroup的层级规则对于合理设计容器资源隔离方案至关重要。掌握单子系统单层级、多子系统单层级和进程单cgroup三大核心规则,能够帮助开发者在实际应用中避免常见陷阱,构建高效可靠的资源控制系统。