我的应用程序在5个并行dynos上运行在heroku上。恒定负载为500-1500 req / min,因此最高可达25 req / sec。问题是RSS内存不断增长。现在我在内存达到危险等级时手动重启应用程序(1 heroku dyno使用的最大内存为512mb)。内存图表看起来像这样(灰色上轴是512mb的限制):
释放内存时的时刻(在图表上)是我重新启动应用程序时。
奇怪的是,它只在服务器上有持续负载时才会发生。当服务器上有例如2分钟负载时,内存会增加,然后再次下降。因此,似乎由于某种原因垃圾收集器无法正常工作(在服务器加载完成且应用程序不忙之前,它不会收集垃圾)。
我能做些什么吗?我认为这不是内存泄漏,因为当服务器上没有负载时会释放内存......
到目前为止我尝试的是:
也许还有其他选择可以提供帮助?
节点版本为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
},
...
什么是Native
对象(它分配了20mb内存!)?你能否就如何调查造成泄漏的原因向我提出建议?
答案 0 :(得分:1)
通过简单地不使用postgres本地绑定(https://github.com/brianc/node-postgres#native-bindings)来解决问题。当我停止使用本机绑定时(我正在使用Sequelize.js,所以我只是将native
标志更改为false)内存开始正常运行...
似乎pg原生绑定可能存在泄漏?