node频繁重启问题排查
系统通过pm2部署node,通过pm2 list命令观察状态时发现重启次数异常。
| App name id | mode | pid | status | restart | uptime | cpu | mem | watching |
|---|---|---|---|---|---|---|---|---|
| 0 | cluster | 29430 | online | 217 | 32s | 0% | 33.9 MB | disabled |
| 1 | cluster | 29381 | online | 211 | 78s | 0% | 38.2 MB | disabled |
| 2 | cluster | 29078 | online | 185 | 8m | 0% | 49.1 MB | disabled |
| 3 | cluster | 29064 | online | 214 | 8m | 0% | 54.1 MB | disabled |
运行时间很短,但restart一栏数值过高。一般restart触发的条件主要有如下三条,当任意一条发生后,应用被重新拉起,那么restart数值增加。
- 程序出现异常,未捕获,导致线程退出。
- Promise状态为rejected未捕获异常,导致线程退出。
- 发送退出信号,退出线程。 调用process.ext()退出。
排查1,2两项后均正常,通过命令pm2 logs观察日志信息。登录到机器上输入pm2 logs,运行两分钟左右出现如下所需要的信息。
PM2 | App name:xxx id:1 disconnected
PM2 | App [xxx] with id [1] and pid [16508], exited with code [0] via signal [SIGINT]
PM2 | Starting execution sequence in -cluster mode- for app name:xxx id:1
PM2 | App name:xxx id:1 online
发现 exited with code [0],看到是正常退出。但代码本身没有退出逻辑。于是判断process.exit()被调用,触发应用退出,随后对exit事件监听。
process.on(‘exit’, (code) => {
console.log(About to exit with code: ${code});
});
观察调用栈,发现调用栈中执行的js脚本有问题。原来代理里有eval执行脚本,而脚本里还包含了process.exit()方法,导致应用退出。
总结
退出问题排查,要清楚导致退出可能发生的原因,再尝试捕获相关参数,如退出码,定位并发现问题。
Node.js应用频繁重启之谜
本文记录了一次Node.js应用频繁重启的问题排查过程。通过分析PM2的日志信息,发现重启是由进程内部调用了process.exit()导致的,并最终定位到了问题的根源在于代理中的JS脚本执行了非法的process.exit()操作。
2403

被折叠的 条评论
为什么被折叠?



