github编辑

控制组

什么是控制组

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

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

无 cgroups 限制:                  有 cgroups 限制:
┌──────────────────────┐           ┌──────────────────────┐
│     宿主机资源        │           │     宿主机资源        │
│   ┌─────────────┐    │           │   ┌───┬───┬───┐      │
│   │  容器 A     │    │           │   │ A │ B │ C │      │
│   │  占用所有   │    │           │   │1GB│1GB│1GB│ ← 限制│
│   │  内存和 CPU │    │           │   ├───┼───┼───┤      │
│   └─────────────┘    │           │   │2核│1核│1核│      │
│   容器 B、C 饥饿     │           │   └───┴───┴───┘      │
└──────────────────────┘           └──────────────────────┘

cgroups 的历史

时间
事件

2006

Google 工程师提出 cgroups 概念

2008

Linux 2.6.24 正式支持 cgroups v1

2016

Linux 4.5 引入 cgroups v2

现在

Docker 默认使用 cgroups v2(如系统支持)


cgroups 可以限制的资源

资源类型
子系统
说明

CPU

cpu, cpuset

CPU 使用时间和核心分配

内存

memory

内存使用上限和 swap

块设备 I/O

blkio

磁盘读写速度限制

网络

net_cls, net_prio

网络带宽优先级

进程数

pids

限制进程/线程数量


Docker 中的资源限制

内存限制

参数
说明

-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 限制

进程数限制


查看容器资源使用


资源限制的效果

内存超限

CPU 限制验证


cgroups v1 vs v2

特性
cgroups v1
cgroups v2

层级结构

多层级(每个资源单独)

统一层级

管理复杂度

复杂

简化

资源分配

基于层级

基于子树

PSI(压力监控)

rootless 容器

部分支持

完整支持

检查系统使用的版本


在 Compose 中设置限制


最佳实践

1. 始终设置内存限制

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

3. 监控资源使用


本章小结

资源
限制参数
示例

内存

-m

-m 512m

CPU 核心数

--cpus

--cpus=1.5

CPU 绑定

--cpuset-cpus

--cpuset-cpus="0,1"

磁盘 I/O

--device-write-bps

--device-write-bps /dev/sda:10mb

进程数

--pids-limit

--pids-limit=100

延伸阅读

最后更新于