github编辑

12.3 控制组

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

12.3.1 什么是控制组

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

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

spinner

12.3.2 cgroups 的历史

相关信息如下表:

时间
事件

2006

Google 工程师提出 cgroups 概念

2008

Linux 2.6.24 正式支持 cgroups v1

2016

Linux 4.5 引入 cgroups v2

现在

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


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. 监控资源使用

运行以下命令:


最后更新于