执行pm2 restart all后PM2崩溃,进程列表丢失问题咨询
解决PM2重启崩溃及Node.js应用内存泄漏问题
一、PM2执行pm2 restart all后崩溃、进程列表清空的修复方案
- 升级PM2到稳定版:旧版本存在已知的进程管理bug,执行
pm2 update升级至最新稳定版本,能解决大部分重启异常问题。 - 替换重启命令:避免直接使用
pm2 restart all,改用更温和的零停机重载命令pm2 reload all;如果不需要零停机,可指定进程名逐个重启,比如pm2 restart <your-app-name>,降低批量操作的崩溃风险。 - 排查崩溃日志:执行
pm2 logs --err查看PM2崩溃时的错误日志,定位具体诱因——比如配置文件语法错误、进程权限不足、系统资源耗尽等。 - 使用配置文件管理进程:生成PM2生态配置文件
ecosystem.config.js(执行pm2 ecosystem),在文件中明确配置应用参数,示例:
后续用module.exports = { apps: [{ name: 'your-node-app', script: './app.js', instances: 'max', env: { NODE_ENV: 'production' } }] }pm2 start ecosystem.config.js启动应用,重启时执行pm2 restart ecosystem.config.js,避免因进程列表丢失导致的异常。 - 检查运行权限:确保PM2以拥有足够权限的普通用户运行,避免root用户运行带来的权限冲突,同时保证应用目录的读写权限正常。
二、Node.js应用内存泄漏、运行变慢的优化方案
- 启用PM2内存自动重启:在
ecosystem.config.js中配置max_memory_restart参数,当应用内存占用阈值触发时自动重启,示例:module.exports = { apps: [{ // ...其他配置 max_memory_restart: '600M' // 内存超过600MB时自动重启 }] } - 排查内存泄漏根源:
- 用
pm2 start app.js --node-args="--inspect"启动应用,通过Chrome DevTools的Memory面板抓取堆快照,分析内存占用较高的对象、未释放的资源(如数据库连接、事件监听器)。 - 使用
pm2 monit实时监控应用的CPU、内存占用,观察内存增长趋势,定位泄漏时间段对应的代码逻辑。
- 用
- 优化定时重启策略:如果已配置定时任务,优先使用PM2内置的
cron_restart参数,在ecosystem.config.js中添加:
避免使用外部脚本操作PM2,减少异常触发概率。module.exports = { apps: [{ // ...其他配置 cron_restart: '0 2 * * *' // 每天凌晨2点自动重启 }] } - 修复代码层面的泄漏:
- 检查是否存在未释放的数据库连接、Redis连接,确保每次使用后调用
release()或close()。 - 移除不必要的全局变量,避免变量持续累积占用内存。
- 清理未移除的事件监听器,防止内存泄漏。
- 检查是否存在未释放的数据库连接、Redis连接,确保每次使用后调用
- 启用日志轮转:安装PM2日志轮转插件
pm2 install pm2-logrotate,防止日志文件过大占用磁盘资源,间接影响应用运行稳定性。
内容的提问来源于stack exchange,提问作者farshid.chegini
相关产品推荐
相关产品推荐

