Heroku 上的 Node.js Web 服务器 - 内存不断增长

6
我的应用在Heroku上运行,使用了5个并行dyno。服务器不断承载500-1500次请求/分钟,即每秒最多25个请求。问题是RSS内存不断增长。目前当内存达到危险水平(1个Heroku dyno使用的最大内存为512mb)时,我会手动重启应用程序。内存图表如下(上方灰色轴位于512mb限制处):

enter image description here

图表上释放内存的时刻是我重新启动应用程序的时候。
奇怪的是,只有在服务器不断承载负载时才会发生这种情况。例如,当服务器负载持续2分钟时,内存会增加,之后又会下降。因此,似乎垃圾收集器无法正常工作(直到服务器负载完成且应用程序不再繁忙之前,它都不会清除垃圾)。
我能做些什么呢?我认为这不是内存泄漏,因为当服务器没有负载时,内存会被释放...
我尝试过的方法是:
  1. 每2分钟手动调用GC
  2. 设置--max-old-space-size = 300,但是当内存达到300MB时什么也没发生 - 它仍在增加。
也许还有其他选项可以帮助吗?
Node版本是0.10.20
我使用了node的memwatch包,并成功从应用程序中收集堆差异: 因此,我想必须存在某种泄漏。第一个差异中最大的内存变化为:
        ...
        {
          "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个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接