Docker-04:CGroups资源控制组

在 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 通过统一层级简化管理,逐渐成为主流。