github编辑

12.3 控制组

控制组 (Cgroups) 是 Linux 内核提供的另一种关键机制,主要用于资源的限制和审计。

12.3.1 什么是控制组

控制组 (Control Groups,简称 cgroups) 是 Linux 内核的一个特性,用于 限制、记录和隔离 进程组的资源使用 (CPU、内存、磁盘 I/O、网络等)。

核心作用:让多个容器公平共享宿主机资源,防止单个容器耗尽系统资源。

spinner

12.3.2 cgroups 的历史

时间
事件

2006

Google 工程师提出 “process containers” 概念

2007

为避免与 Linux 容器概念混淆,更名为 “control groups” (cgroups)

2008

Linux 2.6.24(2008年1月)正式合并 cgroups v1

2016

Linux 4.5 引入 cgroups v2

现在

Docker 在宿主机支持 cgroups v2 时会自动使用 v2,否则回退到 v1


12.3.3 cgroups 可以限制的资源

资源类型
子系统
说明

CPU

cpu, cpuset

CPU 使用时间和核心分配

内存

memory

内存使用上限和 swap

块设备 I/O

blkio

磁盘读写速度限制

网络

net_cls, net_prio

网络带宽优先级

进程数

pids

限制进程/线程数量


12.3.4 Docker 中的资源限制

Docker 提供了丰富的参数来配置容器的资源限制,主要包括内存、CPU、磁盘 I/O 等。

内存限制

参数
说明

-m / --memory

硬限制 (超过会 OOM Kill)

--memory-swap

内存 + swap 总限制

--memory-reservation

软限制 (内存竞争时生效)

--oom-kill-disable

禁用 OOM Killer (谨慎使用)

CPU 限制

参数
说明

--cpus

限制 CPU 核心数 (如 1.5)

--cpuset-cpus

绑定到特定 CPU 核心

--cpu-shares

CPU 时间片权重 (相对值)

--cpu-period / --cpu-quota

精细控制 CPU 配额

磁盘 I/O 限制

进程数限制


12.3.5 查看容器资源使用


12.3.6 资源限制的效果

内存超限

CPU 限制验证


12.3.7 cgroups v1 vs v2

特性
cgroups v1
cgroups v2

层级结构

多层级 (每个资源单独)

统一层级

管理复杂度

复杂

简化

资源分配

基于层级

基于子树

PSI (压力监控)

rootless 容器

部分支持

完整支持

检查系统使用的版本


12.3.8 在 Compose 中设置限制

在 Compose 中设置限制配置如下:


12.3.9 最佳实践

在使用 Cgroups 限制资源时,遵循一些最佳实践可以避免潜在的问题。

1. 始终设置内存限制

2. 为关键应用设置 CPU 保证

3. 监控资源使用


最后更新于