pm2 list 里 restart 列一小时从 0 涨到 312,status 在 online 和 errored 之间来回跳。日志末尾只有 SIGKILL,没有业务堆栈。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

pm2 describe app
pm2 logs app --lines 200 --err

max_memory_restart 设得比实际驻留内存低,进程刚跑起来就被判定超限杀掉重启。另一种是未捕获异常直接退出,pm2 按 autorestart 拉起,表面看都是反复重启。这一点先确认清楚,后面就不用反复试。

「pm2 重启次数」这类改动最怕改一半,回滚脚本先准备好,再动生产。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

具体做法是,把 restart 时间点和内存曲线对上 能对上就是阈值问题;把 max_memory_restart 调到实测峰值的一点五倍以上;排除阈值后去翻退出码 137 是 SIGKILL 1 是未捕获异常;给进程补上 uncaughtException 日志 落盘之后再退出。

改完照着核一遍,restart 计数半小时不再增加 status 稳定在 online 内存曲线压在阈值以下。

作者 9823189