关键业务Master进程(如Nginx主进程、数据库监听器)应设OOMScoreAdjust=-1000以确保OOM时被内核跳过;需通过systemd drop-in持久配置,同步启用cgroup v2、激活systemd-oomd并禁止cgroup移动,避免保护失效。

关键业务的 Master 进程(如 Nginx 主进程、数据库监听器、API 网关控制面)必须在内存紧张时拥有最高生存优先级。systemd 提供了直接、稳定、可持久化的 OOM 评分控制能力,核心不是“不让系统OOM”,而是确保 Master 进程在 OOM 事件中被内核跳过——最有效方式是将其 OOMScoreAdjust 设为 -1000。
为什么只调 Master 进程,不调 Worker?
Master 进程通常以 root 启动,负责配置加载、worker 管理、信号响应和热重载;而 worker 进程多以低权限用户(如 www-data、mysql)运行,且数量动态变化。OOM Killer 作用于每个进程个体,但 systemd 管理的是服务单元(unit),它只对主服务进程(即 Master)应用 OOMScoreAdjust 设置。调整 worker 的 oom_score_adj 需在运行时逐个写入 /proc,不可靠且易失效。
- systemd 服务文件控制的是服务启动入口,即 Master 进程生命周期
- Worker 是 Master fork 出来的子进程,默认继承父进程的 oom_score_adj,但部分服务(如 Nginx)会主动重置该值,因此不能依赖继承
- 真正需要保障的是 Master:只要它活着,就能重启 worker、恢复服务、响应 reload 信号
正确配置 OOMScoreAdjust 的两种方式
推荐使用 drop-in 方式,避免覆盖发行版包管理器提供的原始 unit 文件,也便于版本升级后保留配置:
-
方法一(推荐):drop-in 配置
执行:sudo systemctl edit nginx.service,填入:[Service]<br>OOMScoreAdjust=-1000
保存后运行sudo systemctl daemon-reload && sudo systemctl restart nginx -
方法二:临时调试验证
获取 Master PID(如pgrep -f "nginx: master"),再执行:echo -1000 | sudo tee /proc/<PID>/oom_score_adj。此操作立即生效但重启后丢失,仅用于验证逻辑是否通路
必须同步做的三件事,否则 -1000 可能失效
仅设 OOMScoreAdjust=-1000 不足以保证绝对安全。systemd-oomd(若启用)、cgroup 移动、内核参数缺失都可能导致保护失效:
- 确认启用 cgroup v2:
cat /proc/1/environ | tr '\0' '\n' | grep unified_cgroup_hierarchy=1。若无输出,需在内核启动参数中添加systemd.unified_cgroup_hierarchy=1 - 检查 systemd-oomd 是否激活:
sudo systemctl is-active systemd-oomd。若为 inactive,执行sudo systemctl enable --now systemd-oomd,否则传统 OOM Killer 将成为唯一防线 - 禁止 Master 进程被意外移动到其他 cgroup:在 service 文件中显式声明
MemoryAccounting=true,并确保未被systemd-run --scope或桌面会话管理器包裹(可通过systemctl status nginx查看其所属 slice)
对不同关键服务的差异化建议
并非所有 Master 进程都适合无条件设 -1000。需结合角色与系统韧性综合判断:
- 数据库主节点(PostgreSQL / MySQL):必须设为 -1000。数据一致性与连接守卫不可中断
-
Nginx / HAProxy 主进程:推荐 -1000,但务必配合
worker_processes auto和worker_rlimit_nofile控制资源基线,防止 Master 自身内存膨胀 -
Ollama / LLM 推理服务:不建议 -1000。其 Master 常驻但实际显存/内存消耗由模型加载决定,应优先用
MemoryMax=+GPU memory limits控制,OOMScoreAdjust 设为 -900 更稳妥 - 自研后台守护进程:若具备优雅降级能力(如关闭缓存、限流日志),可设为 -500~-800,留出一定弹性空间,避免因单点绝对豁免导致系统僵死

















