我正在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 +。
回滚到我的应用程序的先前版本工作正常,但我看不出我实现的更改如何导致内存使用失控这样。这是我实际改变的地方:
修复了启动时自定义环境变量的错误类型检查
也创建了一个datasources.development.json datasources.production.json文件,以确保在开发中 模式我连接到内存数据库而不是实时MongoLab 托管数据库
对我的两个模型进行了一些ACL更改,以允许管理员用户通过API编写(在本地工作正常)
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
以查看问题是否消失。
答案 0 :(得分:2)
LoopBack不会自己分叉进程,但是强主管会这样做,而你所描述的行为与之相符。
如果是这种情况(例如,如果您的Procfile中有slc run
或sl-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的总内存使用。