一次512MB VPS OOM事件:SSH瞬间断开、API返回521及后续低内存清理

💡 原文英文,约2000词,阅读约需8分钟。
📝

内容提要

512MB内存VPS因内存不足出现SSH断开和API返回521错误,内核日志显示网络接收路径内存分配失败。作者采取清理系统、将swap扩至2GB、zswap改用zstd压缩、调整内核参数、为SSH和Nginx等入口服务设置OOM保护、限制容器内存、安装earlyoom、限制日志占用等优化。九天后系统稳定,未再OOM。结论:512MB需精细调优,但根本方案仍是升级内存。

🔎

延伸解读

故障表象与真实原因

SSH 在密钥认证前断开、API 返回 521,容易误判为网络或密钥问题。但内核日志显示网络接收路径出现 page allocation failure,涉及 virtio_net、tcp_gro_receive 等函数。这说明低内存已影响内核处理网络包的能力,导致 SSH 握手、Nginx 转发和 API 上游流量随机失败。

低内存调优的关键措施

作者将 swap 扩至 2GB,zswap 压缩器改为 zstd,并调整 vm.min_free_kbytes 等内核参数。同时为 sshd、nginx 等入口服务设置 OOMScoreAdjust=-700,限制容器内存,安装 earlyoom 并限制日志占用。这些措施为 512MB 内存提供了明确的回退路径和优先级。

调优后的效果与局限

九天后系统稳定,无新 OOM 或 page allocation failure,earlyoom 未触发杀进程。但 512MB 仍是 512MB,调优只是推迟边界,根本方案仍是升级到 1GB 内存。低配 VPS 需精细调优,不能依赖默认配置。

❓

Q&A

512MB VPS 出现 SSH 瞬间断开和 API 返回 521 错误,可能是什么原因?

根据文章,这很可能是内存不足导致的。内核日志显示网络接收路径出现重复的 page allocation failure,涉及 virtio_net、tcp_gro_receive 等函数,说明低内存已影响内核处理网络数据包,导致 SSH 握手和 Nginx 转发随机失败。

如何为 512MB 小内存 VPS 扩大 swap 并优化 zswap 压缩?

文章中将 swap 扩大到 2GB:swapoff /swapfile、fallocate -l 2G /swapfile、chmod 600、mkswap、swapon,并在 /etc/fstab 添加 /swapfile none swap sw 0 0。zswap 压缩器从默认 lzo 改为 zstd,运行时执行 echo zstd > /sys/module/zswap/parameters/compressor,并在 GRUB 中持久化:zswap.enabled=1 zswap.compressor=zstd。

在低内存 VPS 上,如何保护 SSH、Nginx 等入口服务不被 OOM 杀死?

文章通过 systemd drop-in 为 ssh、nginx、supervisor 设置 OOMScoreAdjust=-700,sshd 本身已是 -1000。同时使用 earlyoom 并配置 --avoid 正则避免主动杀死这些入口服务,形成双重保护。

512MB VPS 上如何限制容器内存并设置 OOM 优先级?

在 docker-compose 中为容器设置 mem_limit、memswap_limit、pids_limit 和 oom_score_adj。例如 hysteria 设置 mem_limit: 96m、memswap_limit: 160m、pids_limit: 128、oom_score_adj: 500。注意 Debian 打包的 Docker 26.1.5 不支持 docker update 动态修改 --oom-score-adj,需在 compose 中设置后重建容器。

earlyoom 在低内存 VPS 上如何配置以优先杀死代理容器?

安装 earlyoom 后,在 /etc/default/earlyoom 中设置 EARLYOOM_ARGS,例如:-m 10,5 -s 20,10 -r 300 --prefer '(^|/)(hysteria|tuic-server|filebrowser)( |$)' --avoid '(^|/)(sshd|sshd-session|nginx|supervisord|gunicorn|systemd|dockerd|containerd)( |:|$)'。这样在内存不足时会优先终止代理和文件服务容器,避免杀死入口服务。

经过低内存优化后,512MB VPS 的稳定性如何?

文章作者在优化后观察了九天,系统运行稳定:uptime 9 天,可用内存约 227Mi,swap 使用约 346Mi,无新的 OOM 或 page allocation failure,earlyoom 未实际杀死任何进程,SSH、API 和文件服务入口均可达。但作者强调根本方案仍是升级到 1GB 内存。

🏷️

标签

➡️

继续阅读