【发布时间】:2014-11-23 07:03:48
【问题描述】:
我的应用程序已在 5 个并行测功机上的 heroku 上启动并运行。恒定负载为 500-1500 req/min,最高可达 25 req/sec。问题是 RSS 内存在不断增长。现在我在内存达到危险级别时手动重新启动应用程序(1 heroku dyno 使用的最大内存为 512mb)。内存图表如下所示(灰色轴上方为 512mb 限制):
释放内存的时刻(在图表上)是我重新启动应用程序的时候。
奇怪的是,只有在服务器负载恒定时才会发生这种情况。例如,当服务器上有 2 分钟的负载时,内存会增加,然后再次下降。所以似乎由于某种原因垃圾收集器无法正常工作(在服务器加载完成并且应用程序不忙之前它不会收集垃圾)。
我能做些什么吗?我认为这不是内存泄漏,因为在服务器上没有负载时会释放内存...
到目前为止我尝试的是:
- 每隔 2 分钟手动调用一次 GC
- 设置 --max-old-space-size=300 但是当内存达到 300mb 时没有任何反应 - 它仍在增加。
也许还有其他选择可以提供帮助?
节点版本为0.10.20
我使用了 node memwatch 包,并设法从应用程序收集堆差异:
- http://jsonfiddle.net/auf8d(11 分钟之间的堆差异,+37 MB)
- http://jsonfiddle.net/4nvcd(15 分钟之间的堆差异,+50 MB)
所以我猜肯定有泄漏。与第一个 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