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

use*_*521 6 memory garbage-collection memory-leaks heroku node.js

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

在此输入图像描述

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

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

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

我到目前为止尝试的是:

  1. 每隔2分钟手动调用GC
  2. 设置--max-old-space-size = 300但是当内存达到300mb时没有任何反应 - 它仍在增加.

也许还有其他选择可以帮助?

节点版本是 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
        },
        ...
Run Code Online (Sandbox Code Playgroud)

什么是Native对象(它分配了20mb内存!)?你能否告诉我如何调查导致泄漏的确切原因?

use*_*521 2

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

看来 pg 原生绑定可能存在泄漏?