use*_*521 6 memory garbage-collection memory-leaks heroku node.js
我的应用程序在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
},
...
Run Code Online (Sandbox Code Playgroud)
什么是Native
对象(它分配了20mb内存!)?你能否告诉我如何调查导致泄漏的确切原因?
通过简单地不使用 postgres 本机绑定(https://github.com/brianc/node-postgres#native-bindings)就解决了这个问题。当我停止使用本机绑定时(我正在使用 Sequelize.js,所以我只是将native
标志更改为 false),内存开始正常运行......
看来 pg 原生绑定可能存在泄漏?