heroku上的node.js web服务器 – 不断增长的内存

我的应用程序启动并运行在5个平行的dynos上的heroku。 有500-1500瑞克/分钟的恒定负载,所以高达25瑞克/秒。 问题是RSS内存在不断增长。 现在我手动重新启动应用程序时,内存达到危险的水平(1 heroku dyno使用的最大内存是512MB)。 内存图表看起来像这样(灰色上限是在512mb限制):

在这里输入图像描述

内存释放的时候(在图表上)是当我重新启动应用程序。

奇怪的是,只有当服务器上有不断的负载时才会发生。 当服务器上存在例如2分钟的负载时,则内存增加,之后再下降。 所以看起来由于某种原因,垃圾收集器工作不正常(这是没有收集垃圾,直到服务器加载完成,应用程序不忙)。

有什么我可以做的吗? 这不是内存泄漏,我认为是因为当服务器上没有负载时释放内存…

我到目前为止所尝试的是:

  1. 以2分钟间隔手动呼叫GC
  2. 设置 – max-old-space-size = 300然而当内存命中300mb时没有任何反应 – 它仍在增加。

也许有其他的select,可以帮助?

节点版本是0.10.20


我使用节点memwatch包,我设法从应用程序收集堆差异:

  • http://jsonfiddle.net/auf8d(11分钟,+37 MB之间的堆差异)
  • http://jsonfiddle.net/4nvcd(15分钟,+50 MB之间的堆差异)

所以肯定会有一些泄漏。 最大的记忆从第一差异变化:

  ... { "what": "Array", "size_bytes": 9320312, "size": "8.89 mb", "+": 79086, "-": 10215 }, ... { "what": "Closure", "size_bytes": 2638224, "size": "2.52 mb", "+": 36826, "-": 184 }, { "what": "Native", "size_bytes": 21471232, "size": "20.48 mb", "+": 546, "-": 0 }, { "what": "String", "size_bytes": 2068264, "size": "1.97 mb", "+": 36968, "-": 1223 }, ... 

什么是Native对象(它分配了20mb的mem!)? 你可以给我一些build议,如何调查究竟是什么导致泄漏?

这个问题是通过简单地不使用postgres本地绑定( https://github.com/brianc/node-postgres#native-bindings )来解决的。 当我停止使用本机绑定(我使用Sequelize.js,所以我只是改变native标志为假)内存开始正常行为…

似乎有可能是泄漏的PG本地绑定?