linux上用cgroup v2实现跨容器内存硬上限与软限制动态分配,核心是统一v2接口、分层组织控制组,通过memory.max和memory.low协同控制资源水位,构建可伸缩、可继承、可热更新的内存配额树。

在 Linux 上用 cgroup v2 实现跨容器的内存硬上限与软限制动态分配,核心是统一使用 v2 接口、分层组织控制组,并通过 memory.max 和 memory.low 协同控制资源水位。它不是给每个容器单独设限,而是构建一个可伸缩、可继承、可热更新的内存配额树。
启用并确认 cgroup v2 环境
确保系统已启用 cgroup v2(内核 ≥ 4.15):
- 检查启动参数是否含
systemd.unified_cgroup_hierarchy=1,修改/etc/default/grub后执行sudo update-grub && sudo reboot - 验证:运行
stat -fc%T /sys/fs/cgroup | grep cgroup2,输出非空即表示已激活 - 禁用 legacy 挂载点(如
/sys/fs/cgroup/memory),防止容器运行时回退到 v1 兼容模式
构建跨容器共享的内存控制组层级
不依赖单个容器 ID,而是按业务或租户维度创建逻辑组,让多个容器归属同一 cgroup 路径:
- 创建顶层组:
sudo mkdir -p /sys/fs/cgroup/web-tier - 设置该组整体硬上限(例如 4GB):
echo 4G > /sys/fs/cgroup/web-tier/memory.max - 设置软保障水位(例如 1.5GB):
echo 1.5G > /sys/fs/cgroup/web-tier/memory.low - 将多个容器进程移入该组(以 containerd 或 Podman 为例):
echo $PID > /sys/fs/cgroup/web-tier/cgroup.procs,或启动时指定--cgroup-parent=/web-tier
动态调整硬限与软限值
cgroup v2 支持运行时写入,无需重启容器:
- 上调整体硬限(如从 4G 到 6G):
echo 6G > /sys/fs/cgroup/web-tier/memory.max - 下调软限(如从 1.5G 到 1G):
echo 1G > /sys/fs/cgroup/web-tier/memory.low - 注意:新
memory.max值不能低于当前组内所有进程实际内存占用(memory.current),否则写入失败并返回错误 - 可配合监控脚本,在
memory.pressure持续升高时自动收紧memory.low,缓解压力
验证与可观测性要点
仅设值不等于生效,需实时观测关键指标判断行为是否符合预期:
- 查看当前内存使用:
cat /sys/fs/cgroup/web-tier/memory.current - 观察压力信号:
cat /sys/fs/cgroup/web-tier/memory.pressure(low/medium/critical 三档) - 检查回收效果:
cat /sys/fs/cgroup/web-tier/memory.stat | grep pgpgin\|pgpgout\|pgmajfault - 若
memory.low生效,会在 memory pressure 为 medium 时显著提升页回收频率;若memory.max触发,则memory.oom.group可能被置为 1,且对应进程被 OOM Killer 终止











