背景
你的服务器上跑着 MariaDB、两个 Flask 实例、Kuma 和 Adminer,一共 5 个容器。
某天早上醒来,打开监控大屏,发现一片红,微信收到一堆“服务不可用”的告警。你赶紧 SSH 登录服务器,敲下 docker ps -a,发现有几个容器的状态变成了 Exited (137)。
你查了容器的日志,发现没有任何 Python 或 SQL 报错,它们就像是凭空消失了一样。
原因
容器没有报错,是被系统“亲手杀”了。
Linux 系统里有个冷酷无情的杀手,叫 OOM Killer(Out Of Memory Killer)。当系统物理内存耗尽时,它为了保住系统核心不崩溃,会强制杀掉一些吃内存的大户。
因为你的机器只有 2GB 内存,跑 5 个服务,一旦遇到某个时间段并发稍微高一点,或者数据库做一次大的查询,内存瞬间见底。OOM Killer 启动,挑个分值高的进程(比如那个占用内存最大的容器)一刀毙命,容器就被强杀了(退出码 137 代表被 SIGKILL 信号杀死)。
解决:用 Swap 给内存加一条“安全气囊”
解决物理内存不够最直接的办法是加钱买内存条。但在云服务器上,更聪明的零成本方案是:开启 Swap(虚拟内存)。
Swap 就是把硬盘上划出一块区域,当内存不够用时,系统把暂时不用的数据挪到硬盘上,腾出物理内存。就像你办公桌太小,把冬天不穿的衣服先塞进床底下的收纳箱。
第 1 步:创建 Swap 文件
# 在根目录下创建一个 2G 大小的 Swap 文件sudofallocate-l2G /swapfile# 设置只有 root 能读写(安全关键)