本页目录
cgroup
覆盖: cgroup v2 统一层级 → 控制器 (cpu/memory/io/pids/cpuset) → cgroupfs → memory reclaim → PSI → cgroup 编程模型 内核版本: 2.6 (v1) ~ 6.x (v2)
概述
cgroup (control group) 提供进程的资源使用限制、优先级控制和统计。v2 统一了 v1 的多个独立层级为一棵树,解决了控制器之间无法协调的根本问题。
cgroup v2 vs v1
cgroup v1:
每个控制器有独立的层级 → CPU 和 memory 的控制树可能不同
→ 无法表达"在这个 cgroup 中 CPU 和 memory 的上限是一起作用的"
cgroup v2 (4.5+, 当前默认):
单一统一层级 → 所有控制器共享同一棵树
→ 在同一个 cgroup 目录下设置所有控制器的参数
→ 控制器之间的协调变得可能 (如 memory pressure → IO throttling)
cgroupfs 接口
# 挂载
# 创建 cgroup
# → 自动继承父级的控制器设置
# 移动进程
# 查看进程所属 cgroup
控制器详解
cpu
# 权重 (调度优先级, 默认 100):
# 带宽限制:
memory
# 内存压力通知 (PSI):
io
# 权重:
# 带宽限制:
pids
cpuset
# 钉选 CPU/内存节点:
Memory Reclaim 深入
mm/memcontrol.c— cgroup memory controller 的内核路径:
PSI (Pressure Stall Information)
# /proc/pressure/ — 三级压力指标:
# some: 至少一个 task 在等待 → 资源竞争
# full: 所有非 idle task 都在等待 → 资源完全饱和
编程接口 (内核侧)
// include/linux/cgroup.h
// 内核中 controller 的实现:
;
// memcg: css = mem_cgroup (每个 cgroup 一个)
// blkio: css 挂载在 request_queue 上
参考
- 源码:
kernel/cgroup/cgroup.c(核心框架),mm/memcontrol.c(memory),block/blk-cgroup.c(io),kernel/sched/core.c(cpu) - 内核文档:
Documentation/admin-guide/cgroup-v2.rst(极好) - LWN: "cgroup v2", "Memory control group design"
关键词: cgroup v2, controllers, cpu.weight, memory.max, io.max, PSI, memcg reclaim, cgroupfs