cgroup v2 废弃了 oom_adj 和 oom_score_adj 的 per-process 调控,oom 优先级由 memory.oom.group 和 memory.max 等 cgroup 级配置决定;写入 /proc/pid/oom_score_adj 被内核忽略,属架构移除而非权限问题。
为什么 oom_adj 和 oom_score_adj 在 cgroup v2 下不生效
cgroup v2 完全废弃了 v1 的 oom_adj(对应 /proc/PID/oom_adj)和 oom_score_adj(/proc/PID/oom_score_adj)的 per-process 调控逻辑。v2 把 OOM 优先级控制收归到 memory controller 层级,只认 memory.oom.group 和整体 memory.high/memory.max 等边界设置。写入任何值到 /proc/PID/oom_score_adj 不会报错,但内核直接忽略——这不是权限或路径问题,是架构层面移除。
memory.oom.group 的真实作用和常见误用
memory.oom.group 不是“开启 OOM 分组保护”,而是决定:当该 cgroup 触发 OOM 时,内核是否只 kill 本 cgroup 内的进程(1),还是允许跨 cgroup 杀(0,默认)。它不改变 OOM 选择哪个进程被杀,也不影响 oom_score_adj 的历史值。