github编辑

控制组

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

什么是控制组

控制组(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 中的资源限制

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

运行以下命令:

进程数限制

运行以下命令:


查看容器资源使用

运行以下命令:


资源限制的效果

内存超限

运行以下命令:

CPU 限制验证

运行以下命令:


cgroups v1 vs v2

特性
cgroups v1
cgroups v2

层级结构

多层级(每个资源单独)

统一层级

管理复杂度

复杂

简化

资源分配

基于层级

基于子树

PSI(压力监控)

rootless 容器

部分支持

完整支持

检查系统使用的版本

运行以下命令:


在 Compose 中设置限制

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


最佳实践

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

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

延伸阅读

最后更新于