仅在部署时才会出现大量内存使用

时间:2015-04-20 10:27:17

标签: heroku loopbackjs strongloop

我正在Heroku上运行一个strongloop API,并且在我做了一些小改动之前没有任何问题,现在我遇到了大量内存使用问题,导致应用程序崩溃:

2015-04-20T09:48:02.414727+00:00 heroku[web.1]: Process running mem=728M(142.2%)
2015-04-20T09:48:02.414771+00:00 heroku[web.1]: Error R14 (Memory quota exceeded)

奇怪的是,当我使用NODE_ENV='production' slc run

在本地运行时,这不会发生

当我在本地运行时监视内存使用情况时,在Heroku上运行完全相同的东西时,我总得到(在4个工作进程之间)大约330MB对728MB +。

回滚到我的应用程序的先前版本工作正常,但我看不出我实现的更改如何导致内存使用失控这样。这是我实际改变的地方:

  1. 修复了启动时自定义环境变量的错误类型检查

  2. 也创建了一个datasources.development.json     datasources.production.json文件,以确保在开发中     模式我连接到内存数据库而不是实时MongoLab     托管数据库

  3. 对我的两个模型进行了一些ACL更改,以允许管理员用户通过API编写(在本地工作正常)

  4. datasources.development.json看起来像这样:

    {
      "KaranMongo_live": {
        "name": "KaranMongo_live",
        "connector": "memory",
        "file": "db.json"
      },
      "MyEmail": {
        "name": "MyEmail",
        "connector": "mail",
        "transports": [
          {
            "type": "smtp",
            "host": "smtp.mandrillapp.com",
            "secure": true,
            "port": 465,
            "tls": {
              "rejectUnauthorized": false
            },
            "auth": {
              "user": "HIDDEN",
              "pass": "HIDDEN"
            }
          }
        ]
      }
    }
    

    datasources.production.json看起来像这样:

    {
      "KaranMongo_live": {
        "host": "ds043471-a0.mongolab.com",
        "port": 43471,
        "database": "HIDDEN",
        "username": "HIDDEN",
        "password": "HIDDEN",
        "name": "KaranMongo_live",
        "connector": "mongodb"
      },
      "MyEmail": {
        "name": "MyEmail",
        "connector": "mail",
        "transports": [
          {
            "type": "smtp",
            "host": "smtp.mandrillapp.com",
            "secure": true,
            "port": 465,
            "tls": {
              "rejectUnauthorized": false
            },
            "auth": {
              "user": "HIDDEN",
              "pass": "HIDDEN"
            }
          }
        ]
      }
    }
    

    我真的很难过。有什么想法可能会发生什么?或者至少我会如何追查问题的原因?

    更新 我越接近答案了。似乎设置NODE_ENV=production是罪魁祸首,因为它具有我没有预料到的副作用 - 它使用4个工作节点而不是仅仅一个进程进行环回启动,这压倒了Heroku提供的内存。我将我的datasources.production.json重命名为datasources.live.json并设置NODE_ENV=live以查看问题是否消失。

2 个答案:

答案 0 :(得分:2)

LoopBack不会自己分叉进程,但是强主管会这样做,而你所描述的行为与之相符。

如果是这种情况(例如,如果您的Procfile中有slc runsl-run),那么您可以为其添加--cluster=1选项或在您的设置中设置环境变量Heroku应用程序通过heroku config:set STRONGLOOP_CLUSTER=1

然后你的应用程序仍会在" production"模式,但集群的上限为1工人。

答案 1 :(得分:0)

修正了它!

导致问题的确是NODE_ENV变量 - 我的其他更改实际上都不是问题。

设置NODE_ENV='production'似乎对Strongloop有特殊意义 - 它使用4个工作节点而不是1个单个进程启动,对于Heroku而言,这对于稍微复杂的应用程序来说太过分了。将NODE_ENV更改为其他内容(在我的情况下,NODE_ENV='live')使一切运行正常 - 平均只有86MB的总内存使用。