【问题标题】:node.js web server on heroku - constant memory growheroku 上的 node.js Web 服务器 - 不断增长的内存
【发布时间】:2014-11-23 07:03:48
【问题描述】:

我的应用程序已在 5 个并行测功机上的 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


我使用了 node memwatch 包,并设法从应用程序收集堆差异:

所以我猜肯定有泄漏。与第一个 diff 相比最大的内存变化:

        ...
        {
          "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 内存!)?您能否就如何调查究竟是什么导致泄漏给我建议?

【问题讨论】:

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


    【解决方案1】:

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

    pg 原生绑定好像有泄漏?

    【讨论】:

      猜你喜欢
      • 2014-12-11
      • 1970-01-01
      • 2014-02-25
      • 1970-01-01
      • 2013-10-20
      • 2016-02-24
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      相关资源
      最近更新 更多