【问题标题】:Node.JS memory leak with PM2Node.JS 内存泄漏与 PM2
【发布时间】:2015-04-15 19:50:39
【问题描述】:

我使用pm2 start ... 运行我的服务器,pm2 monit 在 2 小时后显示3GB memory。所以我附上了memwatch,现在又等了2个小时,pm2 monit显示的内存又达到了3GB

所以,我检查了 memwatch 生成的日志。给我看:

{ before: { nodes: 75659, size_bytes: 11141702, size: '10.63 mb' },
  after: { nodes: 73226, size_bytes: 10840598, size: '10.34 mb' },
  change:
   { size_bytes: -301104,
     size: '-294.05 kb',
     freed_nodes: 5141,
     allocated_nodes: 2708,

还有一个:

{ before: { nodes: 72591, size_bytes: 10728318, size: '10.23 mb' },
  after: { nodes: 73284, size_bytes: 10798062, size: '10.3 mb' },
  change:
   { size_bytes: 69744,
     size: '68.11 kb',
     freed_nodes: 5931,
     allocated_nodes: 6620,

现在我真的很困惑,这些是最后的日志,所以我很确定这些是当pm2 monit 显示巨大的内存泄漏时生成的日志。

那么,为什么memwatch 显示10MB+ 内存和pm2 monit 显示3GB+


现在切换到 forevermonit 之类的东西,看看泄漏是否仍然存在。


多一点背景

  • 我一直在尝试配置文件并找到泄漏点,但配置文件上没有显示任何泄漏。
  • memwatch diff 在客户端连接时启动,在客户端断开连接时获取差异。

【问题讨论】:

  • 关于这个,我在过去 2 天试图分析它,但找不到问题。所以我最终决定继续使用 Golang,这是惊人的,巨大的内存和性能差异。非常有效率。最后没有令人困惑的泄漏。加上它很容易编码,在不到一天的时间内将 javascript 重新编码为 golang。

标签: node.js memory-leaks


【解决方案1】:

这个帖子上有很多非常糟糕的答案。真的,真的很糟糕。

答案很简单:您的代码存在内存泄漏,您需要查找并删除它,GC 出错的可能性很小,您的代码很可能是罪魁祸首。

所以首先:

  1. 我发现 PM2 的垃圾收集器不起作用” - 这是 显然是荒谬的,PM2 运行节点,它使用 V8,它有它的 内置自己的垃圾收集器。这不是因为你被禁用 运行 PM2。
  2. 所以在修复之前调用 GC” - 不!如果您的代码有泄漏,手动调用 GC 是很懒惰的,您应该修复它们。
  3. 删除 pm2 后,暂时没有内存泄漏。” - 不,您只是没有在 PM2 中监控它;泄漏仍然存在,您只是看不到错误,因为您使用节点运行它而不查看结果。

其次,实际的解决方案应该是:

使用您的工具分析代码的内存和 CPU 使用情况 选择。对于大多数人来说,这将是 Chrome 的调试工具 连接到正在运行的节点实例,看看有哪些功能 导致内存使用量激增。只需手动调用 GC 很懒,因为您的代码仍然存在泄漏,但您只是在告诉 V8 在您的应用程序泄漏后不断地吸纳内存,这是一种非常懒惰的做法。

【讨论】:

  • 超级简化的代码证明了代码没有泄漏,因为它在没有pm2的情况下执行时没有泄漏。这个问题是 5 年前的问题,现在一定已经解决了。
  • 没有提供超级简化的代码。上面 Vijay 的例子不是简化的代码,它是强制垃圾回收的代码。该问题已解决,因为 GC 被垃圾邮件发送,但这只是掩盖了问题,而不是解决它。
  • 我可以证明这一点。我在开发工具中检查了我的应用程序,发现我没有泄漏。放了几个小时,仍然没有泄漏。我在pm2运行它,内存一直在缓慢上升。然后,我将所有内存囤积变量和函数设置为 null,运行节点(导入除外),否则它应该囤积 0 个字节。在开发工具中,没关系。在下午 2 点?瞧!泄漏。 pm2 肯定有问题
  • 我观察到与其他人相同的行为 - 当我仅使用 Node 启动脚本时,它会保留大约 30-50MB 的内存。当我使用 PM2 启动它时,PM2 最初报告 70MB,然后增长缓慢。我不知道这是 PM2 的问题还是我使用它的方式的问题,但它看起来不像正在运行的脚本的问题。哦,内存分析器没有显示任何变化 - 即使我运行 PM2,当我将分析器附加到子进程时,它显示 35-40MB 而 PM2 显示 240。
  • stackoverflow.com/questions/59474575/… - 关于 SO 的较新帖子表明 PM2 存在问题
【解决方案2】:
  • 我也遇到了同样的问题,但经过一番研究,我发现 nodejs 在使用 pm2 时没有调用垃圾收集器。
  • 因此,在 PM2 修复该问题之前,临时解决方法是强制调用垃圾收集器,使用以下方法

pm2 start app.js --node-args='--expose-gc'

以上参数 --expose-gc 将允许我们从节点 js 强制调用垃圾收集器,现在使用以下代码强制车库收集。

if (global.gc) {
   global.gc();
} else {
   console.log('Garbage collection unavailable.  use --expose-gc '
   + 'when launching node to enable forced garbage collection.');
}  

这将解决 PM2 内存泄漏问题。

【讨论】:

  • 能否提供but after little research i found that nodejs is not calling the garbage collector when using pm2.的来源。谢谢。
  • Node Js 中的 pm2 也发生了内存泄漏。删除 pm2 后,现在不再有内存泄漏。
猜你喜欢
  • 2012-03-11
  • 2016-01-01
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
相关资源
最近更新 更多