cgroups v2通过统一父cgroup实现跨容器内存隔离,关键步骤为:创建quantum-batch组并启用memory控制器;设memory.max=8g作硬上限、memory.high=6g作软预警;将各容器主pid写入cgroup.procs;禁用swap确保硬限生效。

在 Linux 中用 cgroups v2 实现跨容器的内存硬上限与软预警隔离,关键不是“跨容器”本身,而是把多个容器进程统一纳入同一个 cgroup 节点,并正确配置 memory.max(硬上限)和 memory.high(软预警阈值)。cgroups v2 不支持传统意义上的“跨容器组管理”,但可通过共享父 cgroup 或统一调度路径达成等效效果。
一、创建统一父 cgroup 并启用 memory 控制器
所有目标容器必须归属同一 cgroup 层级节点,才能共用同一套内存策略。不能让每个容器各自挂到根目录下,而应归入一个专用父组:
- 确认系统已启用 cgroups v2:mount | grep cgroup2 应显示挂载点为 /sys/fs/cgroup
- 创建隔离父组:sudo mkdir -p /sys/fs/cgroup/quantum-batch
- 启用 memory 控制器(若未默认开启):echo +memory | sudo tee /sys/fs/cgroup/cgroup.subtree_control(需在父目录执行)
- 验证控制器状态:cat /sys/fs/cgroup/quantum-batch/cgroup.controllers | grep memory,输出应含 memory
二、设置硬上限(memory.max)与软预警(memory.high)
两者协同工作:memory.high 是触发内核主动回收的“压力开关”,不杀进程;memory.max 是不可逾越的红线,超限即触发 OOM Killer。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 设硬上限为 8GB:echo 8589934592 | sudo tee /sys/fs/cgroup/quantum-batch/memory.max(或写 8G)
- 设软预警为 6GB(建议为 max 的 70–85%):echo 6442450944 | sudo tee /sys/fs/cgroup/quantum-batch/memory.high
- 禁用 swap 防止绕过限制(真正硬限必需):echo 0 | sudo tee /sys/fs/cgroup/quantum-batch/memory.swap.max
三、将多个容器进程加入该 cgroup
不是“绑定容器”,而是把每个容器的主进程 PID 写入 cgroup.procs。Docker 容器默认使用 systemd 管理,其主进程 PID 可通过 docker inspect -f '{{.State.Pid}}'
- 将第一个容器加入:echo $PID1 | sudo tee /sys/fs/cgroup/quantum-batch/cgroup.procs
- 将第二个容器加入:echo $PID2 | sudo tee /sys/fs/cgroup/quantum-batch/cgroup.procs
- 验证是否成功:cat /sys/fs/cgroup/quantum-batch/cgroup.procs 应列出两个 PID;cat /sys/fs/cgroup/quantum-batch/memory.current 显示合计用量
四、配套监控与行为验证
仅配置不验证等于没做。需确认内核是否按预期响应压力:
- 实时查看内存使用:watch -n 1 'cat /sys/fs/cgroup/quantum-batch/memory.current /sys/fs/cgroup/quantum-batch/memory.high'
- 模拟压力测试(如启动 stress-ng)并观察:stress-ng --vm 2 --vm-bytes 7G --timeout 60s,应触发 memory.high 回收但不 OOM;继续加压至 8.5G 则被 kill
- 查 OOM 日志确认触发点:dmesg -T | grep -i "killed process" | tail -3,进程名应属于该 cgroup 下任一容器










