全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-21 7 分钟 ✍️ juanwangdev

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 等参数

📝 发现内容有误?点击此处直接编辑

← 上一篇 自动化构建推送
下一篇 → Namespace 隔离机制
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库