docker-cgroup-资源限制原理

Docker CGroup 资源限制原理

·5 分钟阅读·1749 字
📋 目录

一、底层基础:Linux 两大内核技术

  1. Namespace:隔离(容器能看到什么:PID、网络、挂载、用户)
  2. CGroup:限制(容器能用多少资源:CPU、内存、磁盘IO、PID)

Namespace 分地盘,CGroup 定配额。

CGroup 全称 Control Group,内核子系统,docker run 的 -m、--cpus 底层全部写入 /sys/fs/cgroup/ 对应目录。

二、五大常用子系统

子系统作用docker参数对应
cpuCPU使用率、时间片配额—cpus、—cpu-shares
cpuset绑定CPU物理核心—cpuset-cpus
memory内存+swap上限-m/—memory、—memory-swap
blkio磁盘读写IO限速—blkio-weight
pids最大进程数—pids-limit

三、内存限制(高频考点)

1. -m/--memory:容器可用物理内存上限

# 物理内存最多512M
docker run -m 512m nginx
  • 容器进程超出内存:内核OOM kill杀掉容器。

2. --memory-swap:物理内存+swap总限额

  • --memory=512m --memory-swap=1g:物理512M,swap额外512M,合计1G
  • --memory-swap=-1:不限制swap,可无限使用宿主机swap(生产不推荐)

误区:不加—memory,容器无内存上限,可吃光宿主机内存。

3. OOM优先级

--oom-kill-disable 关闭容器内OOM杀进程(谨慎使用,易夯机)

四、CPU限制两种方式

方式1:—cpus(docker1.13+推荐,配额限制)

# 最多占用单个CPU 0.5核(50%)
docker run --cpus=0.5 nginx
# 最多2核
docker run --cpus=2 nginx

底层:cpu.cfs_quota_us / cpu.cfs_period_us
默认周期period=100000us,--cpus=2 → quota=200000

方式2:—cpu-shares(权重,相对分配,无硬性上限)

默认1024,多容器争抢CPU时按比例分配。

A:--cpu-shares=2048
B:--cpu-shares=1024

CPU满载时A:B=2:1;宿主机空闲时均可跑满全CPU。

方式3:cpuset 绑定物理CPU核心(多核隔离、高性能)

# 绑定CPU 0、1两个物理核
docker run --cpuset-cpus="0,1" nginx

生产:数据库、中间件绑核,避免CPU上下文切换。

五、blkio 磁盘IO权重限速

# 权重10~1000,默认500
docker run --blkio-weight=200 nginx

磁盘打满时按权重分配带宽,不能精准限制MB/s;精准限速需第三方工具。

六、pids 进程数量限制

# 容器最多创建200个进程
docker run --pids-limit=200 nginx

防fork炸弹,恶意程序无限创建进程打满宿主机PID。

七、实操查看容器cgroup配置

# 进入容器对应cgroup目录
cd /sys/fs/cgroup/memory/docker/容器ID/
cat memory.limit_in_bytes

八、生产踩坑总结

  1. 只设-m不设swap:容器内存打满直接OOM被杀;swap给过小容易频繁swap卡顿。
  2. 只用—cpu-shares不加—cpus:空闲容器依然能吃满整机CPU,无法限制峰值。
  3. 不做pids限制:fork漏洞瞬间占满宿主机PID。

关联文档

  • ../linux/system/Linux — Linux Cgroup 内核机制
  • ../kubernetes/core/K8s 核心概念 — K8s 资源限制