cgroups v2 是 linux 4.5 引入的统一资源管理框架,通过单挂载点、可插拔控制器、三级内存阈值及更精确的 io/cpu 控制,提升 docker 资源限制的简洁性、一致性与安全性。

cgroups v2 是 Linux 内核 4.5 引入的统一资源管理框架,相比 v1,它在 Docker 架构中带来更简洁、一致且安全的资源限制能力。当前主流发行版(如 Ubuntu 22.04+、RHEL 8.3+、Alpine 3.17+)默认启用 unified 模式,Docker 20.10+ 和 containerd 1.4+ 已完整支持。
统一层级结构:单棵树管理所有资源
v1 中 CPU、内存、IO 等子系统各自独立挂载(如 /sys/fs/cgroup/cpu、/sys/fs/cgroup/memory),导致规则易冲突、继承逻辑复杂;v2 将所有控制器纳入单一挂载点 /sys/fs/cgroup,所有资源限制都在同一 cgroup 路径下配置。这意味着容器的 CPU 配额、内存上限、IO 权重等参数可原子性设置,避免了 v1 中因跨子系统路径不一致引发的限制失效问题。
控制器可插拔与默认启用机制
v2 采用“控制器按需启用”设计:每个 cgroup 目录下通过 cgroup.controllers 文件声明启用的控制器(如 cpu memory io pids),并通过 cgroup.subtree_control 显式下放控制权给子 cgroup。Docker 启动容器时自动启用 cpu、memory、pids 等核心控制器,并确保子容器能继承和细化父级策略——这使资源限制更可靠,也便于 Kubernetes 等编排系统做细粒度调度。
增强的内存管理能力
v2 的 memory 控制器整合了 v1 中 memory 与 memory.memsw 的功能,支持统一的 memory.max(硬上限)、memory.low(保障下限)、memory.min(强制保底)三级阈值。Docker 可直接映射 --memory=2g 到 memory.max,同时支持为关键容器设置 memory.low=512m,确保其在内存压力下仍获得基本运行资源——这是 v1 无法实现的“软保障”能力。
更精确的 IO 与 CPU 控制
v2 的 io 控制器支持按设备、按权重(io.weight)和按带宽上限(io.max)双重约束,Docker 可通过 --device-read-bps 或自定义 cgroup v2 参数实现更细粒度磁盘限速;cpu 控制器则统一使用 cpu.weight(取代 v1 的 cpu.shares)和 cpu.max(取代 cpu.cfs_quota_us),数值范围为 1–10000,默认 100,语义更直观——值为 200 的容器在竞争时获得约两倍于默认容器的 CPU 时间。











