在 Docker 技术中,Cgroups(Control Groups) 是 Linux 内核提供的资源隔离与管理机制,用于限制、分配和监控进程组的硬件资源(如 CPU、内存、磁盘 I/O 等)。它通过层级化的控制组实现对容器资源的精细化控制,是 Docker 实现资源隔离的核心技术之一。
一、CGroups的原理
1.分层控制组结构
Cgroups 通过虚拟文件系统(通常挂载于 /sys/fs/cgroup/)管理资源,每个子目录代表一个控制组(Control Group)。控制组按树形层级组织,子组继承父组的资源限制,并支持自定义配额。
示例层级:
·/sys/fs/cgroup/cpu/docker/容器ID/
·/sys/fs/cgroup/memory/docker/容器ID/
2.子系统(subsystems)
每个子系统负责一类资源的控制,docker常用的子系统包括:
·cpu:限制CPU使用率(配额、权重)
·memory:限制内存用量,触发oom(内存溢出)时终止进程
·blkio:限制块设备I/O
·cpuset:绑定进程到特定CPU核或内存节点
·devices:控制设备访问权限
·net_cls:标记网络数据包,配合浏览控制工具限流
3.资源限制机制
通过配置文件动态调整参数(如 cpu.cfs_quota_us 设置时间片配额),进程加入控制组后,其资源消耗受组内配置约束。例如:
·向asks 文件写入进程 PID 将其纳入控制组。
·资源超限时(如内存超限),内核触发回收或终止进程。
4.Cgroups v1与V2的演进
V1:各子系统独立管理,灵活性高但配置复杂,易出现冲突。
V2:统一层级结构,简化管理并增强一致性(如单一 cgroup.controllers 文件)。
二、Cgroups在docker中的作用
**1.资源限制:**防止单个容器耗尽宿主机资源(如 CPU 占用 100% 或内存泄漏)。
2.优先级分配:通过权重(如 cpu.shares)分配资源。例如:高优先级容器可获更多 CPU 时间片。
**3.资源统计:**实时监控资源使用量(如 memory.usage_in_bytes),为计费或调度提供数据。
**4.隔离性:**结合 Namespace 实现进程、网络、文件系统的全面隔离,构成容器安全边界。
三、实例:使用Cgroups限制docker容器的CPU资源
场景描述:
限制一个 Redis 容器最多使用 1 个 CPU 核心的 50%。
步骤:
1.启动容器并设置限制
通过 Docker 命令指定资源参数:
bash
docker run -d --name=redis --cpus=0.5 redis:alpine
2.Cgroups自动生成
Docker 在 /sys/fs/cgroup/cpu/docker/<容器ID>/ 目录下创建控制组,并写入参数:
·cpu.cfs_period_us:CPU 周期(默认 100,000 微秒 = 100ms);
·cpu.cfs_quota_us:容器在周期内最大可使用时间(50% → 50,000 微秒)。
bash
# 查看配置
cat /sys/fs/cgroup/cpu/docker/<容器ID>/cpu.cfs_quota_us
# 输出:50000
3.效果验证
1)容器内进程的 CPU 使用率被限制在 50% 以内(通过 top 命令观察)。
2)若进程试图超限,Linux 内核会将其挂起直至下一个周期。
四、总结
**1.原理核心:**Cgroups 通过层级化的控制组和子系统,以配置文件动态约束进程资源。
**2.核心作用:**保障容器间资源公平性、隔离性及宿主机的稳定性。
**3.演进趋势:**Cgroups v2 通过统一层级简化管理,逐渐成为主流。