【问题标题】:pm2 constantly leaking memory when running app in cluster modepm2 在集群模式下运行应用程序时不断泄漏内存
【发布时间】:2021-10-19 11:45:04
【问题描述】:

目前,使用 pm2 在集群模式下运行我的产品应用程序以创建多个实例。但随着时间的推移,我可以看到内存使用量的增加。需要手动重启应用怎么解决?

pm2 start app.js -i 0 -o "/dev/null"

【问题讨论】:

  • 不看代码我们无法解决这个问题。

标签: node.js pm2 node-cluster


【解决方案1】:

我也面临同样的问题。这是因为 pm2 存在内存泄漏问题。

改为使用 nodejs 集群模块。

const cluster = require('cluster')

require('events').EventEmitter.defaultMaxListeners = Infinity;
const OS = require('os');
process.env.UV_THREADPOOL_SIZE = OS.cpus().length


let app = express();


const numCPUs = parseInt(process.env.NO_OF_CPU || 1)

if(cluster.isMaster) {
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  // start server on port
  let appServer = app.listen(process.env.OUTBOUND_PORT, () => {
    console.log(`server listening on ${process.env.OUTBOUND_PORT} `);
  });
}

【讨论】:

  • @AKX --max-memory-restart 的问题是应用程序将重新启动,并且在您的应用程序启动并再次接受请求的同时您可能会丢失请求。而且,在生产环境中,如果不保存应用的当前图像,您就不能冒险频繁启动应用
  • OP 说他们正在使用集群模式。我想 pm2 在这种情况下只会杀死一个泄漏的进程,其余的可以继续服务请求。第二点,如果你的应用真的依赖于本地进程状态,那么它就不具备生产价值,IMO。
【解决方案2】:

您可以:

  • 找出您的应用程序中的内存泄漏在哪里并修复它,或者
  • 设置 --max-memory-restart 选项,让 pm2 在您的应用实例泄漏过多时重新启动它们

【讨论】:

    猜你喜欢
    • 2012-10-14
    • 2012-07-17
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多