必须将sshd的oom_score_adj设为-1000实现内核级免杀,再结合cgroup v2限制非关键进程内存、调优swappiness与overcommit参数,并部署earlyoom前置干预,形成分层防护体系。

要让 SSHD 在极端高负荷下绝对不被 OOM Killer 杀掉,不能只靠 swap 配置——swap 本身是内存耗尽时的兜底机制,它缓解不了 OOM 决策逻辑。真正起决定性作用的是进程级生存权重控制 + 系统级资源约束协同。核心目标不是“不让系统用 swap”,而是“确保 sshd 永远不在 OOM 候选名单里”。
给 sshd 设定内核级免杀标识(最硬保障)
sshd 必须拥有 oom_score_adj = -1000,这是 Linux 内核唯一能跳过该进程进行 OOM 评分的硬规则。
- 对已运行的 sshd:查 PID 后立即执行
echo -1000 | sudo tee /proc/$(pgrep -x sshd)/oom_score_adj - 长期生效(推荐):用 systemd 配置固化
执行sudo systemctl edit ssh,写入:
OOMScoreAdjust=-1000
然后重载:sudo systemctl daemon-reload && sudo systemctl restart ssh
限制非关键进程内存,避免拖垮节点
即使 sshd 免杀,若其他进程(如日志轮转、监控采集、临时脚本)无节制吃光内存,仍会触发 OOM —— 此时 sshd 虽不被杀,但系统可能因调度僵死、网络栈失灵而实际不可达。
- 用 cgroup v2 隔离低优先级任务:
sudo mkdir -p /sys/fs/cgroup/low-priorityecho "max 1G" | sudo tee /sys/fs/cgroup/low-priority/memory.max - 将 cron、backup、collectd 等进程加入该组:
echo $(pgrep collectd) | sudo tee /sys/fs/cgroup/low-priority/cgroup.procs - 对 shell 脚本启动前加内存限制:
ulimit -v 2097152; ./cleanup.sh(限制虚拟内存 2GB)
调优 swap 行为,降低误触发 OOM 概率
swap 不是用来“保 sshd”的,但不当配置会让 OOM 提前或错误触发。关键不是禁用 swap,而是让换页更保守、更可预测:
- 设 swappiness=1(不是 0):
避免内核在仍有空闲内存时就大量换出活跃页,尤其对 sshd 这类常驻小内存但需响应及时的服务更友好 - 配合 overcommit_memory=2 和 overcommit_ratio=85:
让内核明确知道最多可承诺多少内存(物理内存 × 0.85 + swap),防止 malloc 成功后实际分配失败引发 OOM - 配置方式:
写入/etc/sysctl.d/99-oom.conf:
vm.swappiness = 1
vm.overcommit_memory = 2
vm.overcommit_ratio = 85
再执行sudo sysctl -p
部署 earlyoom 作为前置缓冲
原生 OOM Killer 是“最后一击”,而 earlyoom 可在可用内存低于 10% 时提前干预,主动终止低优先级进程(如 Java 应用、批量任务),为 sshd 争取稳定窗口。
- 安装并启用:
sudo apt install earlyoom(Debian/Ubuntu)sudo systemctl enable --now earlyoom - 默认策略已足够,如需强化可编辑
/etc/default/earlyoom:
EARLYOOM_ARGS="-m 10 -M 500"(内存低于 10% 或 swap 使用超 500MB 时触发)











