Linux无内存溢出优先保护机制,OOM Killer只终止进程;可通过cgroups v2设memory.max限制内存上限、调低oom_score_adj值(如-1000)、禁用乐观分配(overcommit_memory=2)三法降低关键进程被杀概率。

设置内存硬性上限,让进程“自限而不连累”
把关键进程放入 cgroups v2 内存控制组,设定 memory.max,超限时仅该组内进程可能被 kill,不会波及系统其他服务。
- 创建控制组:
sudo mkdir -p /sys/fs/cgroup/protected-auth - 启用 memory 控制器:
echo "+memory" | sudo tee /sys/fs/cgroup/cgroup.subtree_control - 设硬上限(例如 1.2GB):
echo 1288490188 | sudo tee /sys/fs/cgroup/protected-auth/memory.max - 启动时加入(systemd 服务示例):
在[Service]段添加:MemoryMax=1.2GMemoryHigh=1G(触发早期内存回收,减少触达 max 的概率)
调低 oom_score_adj,让内核“尽量不选它”
每个进程都有一个 /proc/[pid]/oom_score_adj 值(范围 -1000 到 +1000),值越低,OOM Killer 越不愿杀它。-1000 表示完全豁免(仅 root 可设)。
- 查当前值:
cat /proc/$(pgrep -f "myauthd")/oom_score_adj - 设为最低(需 root):
echo -1000 | sudo tee /proc/$(pgrep -f "myauthd")/oom_score_adj - 持久化建议:在 systemd 服务文件中加一行:
OOMScoreAdjust=-1000
配合内核参数,收窄 OOM 触发面
避免因内存过度分配导致本可避免的 OOM:
- 禁用乐观分配:
echo 2 | sudo tee /proc/sys/vm/overcommit_memory - 调高 overcommit_ratio(如物理内存 16G + Swap 4G,设为 85):
echo 85 | sudo tee /proc/sys/vm/overcommit_ratio - 写入
/etc/sysctl.conf持久生效:vm.overcommit_memory = 2vm.overcommit_ratio = 85
补充:用 earlyoom 替代默认 OOM Killer(可选增强)
earlyoom 是用户态守护进程,响应更快、策略更可控。可配置它对特定进程“避让”:
- 安装后编辑
/etc/default/earlyoom:EARLYOOM_ARGS="-m 8 -r 30 --avoid '^(myauthd|postgres)$'"
(表示当可用内存 ≤8%,且连续30秒未恢复时触发;但跳过 myauthd 和 postgres) - 启用服务:
sudo systemctl enable --now earlyoom


















