站点运行一段时间后数据库突然停止,系统日志出现内存不足终止进程的记录。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

free -m
swapon --show
# 限制
# innodb_buffer_pool_size = 256M

物理内存被多个服务占满,内核在无交换空间时直接终止占用最大的进程。这一点先确认清楚,后面就不用反复试。

「内存溢出被杀」这类改动最怕改一半,回滚脚本先准备好,再动生产。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

具体做法是,增加交换分区作为缓冲;限制各服务内存上限;观察一段时间确认稳定。

改完照着核一遍,系统日志不再出现进程被杀,服务持续运行。

作者 9823189