heroku上的node.js web服务器 - 常量内存增长

时间:2014-09-28 23:08:19

标签: node.js memory heroku memory-leaks garbage-collection

我的应用程序在5个并行dynos上运行在heroku上。恒定负载为500-1500 req / min,因此最高可达25 req / sec。问题是RSS内存不断增长。现在我在内存达到危险等级时手动重启应用程序(1 heroku dyno使用的最大内存为512mb)。内存图表看起来像这样(灰色上轴是512mb的限制):

enter image description here

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

奇怪的是,它只在服务器上有持续负载时才会发生。当服务器上有例如2分钟负载时,内存会增加,然后再次下降。因此,似乎由于某种原因垃圾收集器无法正常工作(在服务器加载完成且应用程序不忙之前,它不会收集垃圾)。

我能做些什么吗?我认为这不是内存泄漏,因为当服务器上没有负载时会释放内存......

到目前为止我尝试的是:

  1. 每隔2分钟手动调用GC
  2. 设置--max-old-space-size = 300然而当内存达到300mb时没有任何反应 - 它仍在增加。
  3. 也许还有其他选择可以提供帮助?

    节点版本为0.10.20


    我使用了节点memwatch包,我设法从app收集堆差异:

    所以我猜必须有一种泄漏。最大的记忆从第一个差异变化:

            ...
            {
              "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内存!)?你能否就如何调查造成泄漏的原因向我提出建议?

1 个答案:

答案 0 :(得分:1)

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

似乎pg原生绑定可能存在泄漏?