Linux内存耗尽时默认触发OOM Killer终止进程保系统运行,但可通过设置vm.panic_on_oom=1和kernel.panic=10实现OOM时直接panic并10秒后自动重启,需写入/etc/sysctl.conf持久化,不适用于生产关键服务。

Linux 内核在内存耗尽时不会自动“保护”进程,而是通过 OOM Killer 被动终止进程来保全系统。所谓“配置保护与触发策略”,实质是控制何时触发、杀谁、怎么提前干预——不是事后补救,而是事前设限 + 主动引导。
一、明确 OOM 触发的核心开关:vm.overcommit_memory
这个参数决定内核是否允许进程申请超出物理内存+swap 总和的虚拟内存:
-
0(默认):启发式判断。内核粗略估算是否可能撑住,对明显越界的分配(如一次 malloc 几十 GB)会拒绝 -
1:总是允许 overcommit。适合科学计算、HPC 等需要大虚拟地址空间但实际用得少的场景;风险是更易触发 OOM -
2:严格限制。最大可分配内存 =swap + RAM × vm.overcommit_ratio(默认50,即最多再加一半物理内存)
✅ 建议生产环境设为 2,避免突发申请直接压垮系统:
echo 2 | sudo tee /proc/sys/vm/overcommit_memory # 永久生效:在 /etc/sysctl.conf 中添加 vm.overcommit_memory = 2 vm.overcommit_ratio = 50
二、控制“杀谁”:调整进程的 OOM 优先级
每个进程都有一个 oom_score(0–1000),值越高越容易被 kill。它由实际内存占用、运行时长、oom_score_adj 共同决定。
- 查看某进程当前得分:
cat /proc/$(pidof nginx)/oom_score
- 降低关键进程被杀概率(例如数据库主进程):
echo -900 | sudo tee /proc/$(pidof mysqld)/oom_score_adj
- 彻底豁免(仅限极少数系统守护进程,慎用):
echo -1000 | sudo tee /proc/$(pidof systemd)/oom_score_adj
⚠️ 注意:oom_score_adj = -1000 不等于“永不被杀”,而是在 OOM 选择逻辑中将其 oom_score 强制归零——若只剩它一个进程在跑,仍可能因无其他目标而被选中。
三、避免全局 OOM:用 cgroups v2 做资源分组隔离
靠单个 oom_score_adj 只能调权重,真正防止单个应用拖垮整机,得靠 cgroups v2 的 memory controller:
-
创建受限组(例如给认证服务专用):
sudo mkdir /sys/fs/cgroup/auth-service echo "+memory" | sudo tee /sys/fs/cgroup/auth-service/cgroup.subtree_control echo 1073741824 | sudo tee /sys/fs/cgroup/auth-service/memory.max # 1GB 硬上限 echo 966367641 | sudo tee /sys/fs/cgroup/auth-service/memory.high # 900MB 软限,触发回收
-
启动时加入该组(systemd 示例):
在/etc/systemd/system/authd.service中添加:[Service] MemoryMax=1G MemoryHigh=900M
✅ 效果:该组内进程超 memory.max 时,OOM Killer 只在组内选目标,不会扫描全局;memory.high 还能提前唤醒 kswapd 回收 page cache,大幅降低硬限触发概率。
四、让系统更早响应:启用 panic 或日志告警
- 设置
panic_on_oom=1:OOM 时直接 panic,适用于高可用集群中需快速故障转移的场景echo 1 | sudo tee /proc/sys/vm/panic_on_oom
- 开启
oom_kill_allocating_task=1:优先杀正在疯狂申请内存的那个进程(常是泄漏源头)echo 1 | sudo tee /proc/sys/vm/oom_kill_allocating_task
- 配合日志监控:
dmesg -T | grep "Out of memory"可捕获每次 OOM 时间、被杀进程、内存状态快照,建议接入 Prometheus + Alertmanager 做阈值告警。
Linux 的内存溢出防护不是靠一个开关,而是组合拳:
限制分配总量 → 分组隔离风险 → 调整进程权重 → 提前回收缓冲 → 记录并告警。
不依赖“智能识别”,只靠确定性规则,才真正可控。


















