Cgroups 资源控制
Cgroups (Control Groups) 是 Linux 容器资源限制的底层机制,下面深入分析。
Cgroups v1 vs v2
v1 架构
Bash
/sys/fs/cgroup/
├── cpu/ # CPU 限制
├── memory/ # 内存限制
├── blkio/ # 块设备 IO
├── devices/ # 设备访问
├── pids/ # 进程数
└── ...
特点:
- 每个子系统独立层级
- 配置分散,可能不一致
- 内核 2.6.24 引入
v2 架构
Bash
/sys/fs/cgroup/
└── (统一层级)
├── cpu.max
├── memory.max
├── io.max
└── pids.max
特点:
- 统一层级,所有控制器一致
- 简化的接口
- 内核 4.5 引入,5.8+ 成熟
CPU 控制
CFS 调度器
Bash
# v1 配置
/sys/fs/cgroup/cpu/docker/<id>/
├── cpu.cfs_period_us # 周期(默认 100000μs)
├── cpu.cfs_quota_us # 配额(如 50000 = 50%)
# v2 配置
/sys/fs/cgroup/docker/<id>/cpu.max
# 格式: quota period
# 50000 100000 = 50% CPU
Bash
# 限制 50% CPU
echo 50000 > /sys/fs/cgroup/cpu/docker/<id>/cpu.cfs_quota_us
# 不限制
echo -1 > /sys/fs/cgroup/cpu/docker/<id>/cpu.cfs_quota_us
内存控制
Bash
# v1 配置
/sys/fs/cgroup/memory/docker/<id>/
├── memory.limit_in_bytes # 内存限制
├── memory.soft_limit_in_bytes # 软限制
├── memory.usage_in_bytes # 当前使用
├── memory.stat # 详细统计
# v2 配置
/sys/fs/cgroup/docker/<id>/
├── memory.max # 硬限制
├── memory.high # 软限制(触发回收)
├── memory.current # 当前使用
└── memory.stat # 详细统计
Bash
# 限制 512MB
echo 536870912 > /sys/fs/cgroup/memory/docker/<id>/memory.limit_in_bytes
# 查看使用
cat /sys/fs/cgroup/memory/docker/<id>/memory.usage_in_bytes
IO 控制
Bash
# v1 blkio
/sys/fs/cgroup/blkio/docker/<id>/
├── blkio.throttle.read_bps_device # 读取 BPS 限制
├── blkio.throttle.write_bps_device # 写入 BPS 限制
├── blkio.throttle.read_iops_device # 读取 IOPS 限制
└── blkio.throttle.write_iops_device # 写入 IOPS 限制
# v2 io
/sys/fs/cgroup/docker/<id>/io.max
# 格式: MAJOR:MINOR rbps wbps riops wiops
# 8:0 1048576 1048576 100 100
Docker 与 Cgroups
text
# 查看容器 Cgroups 配置
docker inspect my-app | grep -A 20 "HostConfig"
# 输出
"CpuShares": 1024,
"CpuPeriod": 100000,
"CpuQuota": 50000,
"Memory": 536870912,
"MemorySwap": 1073741824,
"BlkioWeight": 0,
"PidsLimit": 100
层级结构
text
/sys/fs/cgroup/
└── docker/
├── container1/
│ ├── cpu.max
│ ├── memory.max
│ └── pids.max
└── container2/
├── cpu.max
├── memory.max
└── pids.max
每个容器是 Cgroups 层级中的一个节点,继承父级配置。
动态调整
text
# 运行时修改 CPU 限制
echo 100000 > /sys/fs/cgroup/cpu/docker/<id>/cpu.cfs_quota_us
# 运行时修改内存限制
echo 1073741824 > /sys/fs/cgroup/memory/docker/<id>/memory.limit_in_bytes
要点总结
- Cgroups v1 多子系统独立层级,v2 统一层级
- CPU 控制通过 CFS 调度器的 quota/period 实现
- 内存控制设置 limit_in_bytes (v1) 或 memory.max (v2)
- IO 控制限制 BPS 和 IOPS,防止单容器占满磁盘
- Docker 通过 Cgroups 实现 --cpus、--memory、--blkio-weight 等参数
📝 发现内容有误?点击此处直接编辑