Node.js + Socket.io:Connections断开连接时泄漏内存

时间:2015-08-08 11:58:37

标签: node.js heroku memory-leaks socket.io

背后的故事:

我的节点应用程序,名为Sleepychat(在生产中,托管在Heroku上)最近开始报告内存限制到达错误(512MB)。幸运的是,Heroku允许这样做并且不会使应用程序崩溃直到达到5次,这样才会很好。但是,我觉得奇怪的是,这只是在最近推送到Heroku之后才发生的,其中只涉及添加页面。我的理论是Heroku可能在更新时使用了更新版本的Node,但似乎并非如此。我降级了,错误仍然存​​在。

我的来源可以在GitHub找到。第185行是连接代码,第1553行是断开代码。

现在,我已经花了一些时间来使用New Relic和Node Inspector对代码进行分析,似乎任何连接,无论是允许还是立即拒绝和断开连接,都会分配少量内存,断开连接后不会被释放。

例如,我导航到localhost,页面连接文档就绪,New Relic显示内存略有增加。通常大约500kb(这对我来说似乎仍然很大,但我猜这主要是套接字对象)。当我断开连接时,New Relic中没有发生任何变化。更有趣的是,我可以通过垃圾邮件页面刷新来快速增加内存使用量。之前我曾提到连接是否被拒绝并不重要。通过这个,我的意思是,在15秒内相互连接3次后,该网站将立即拒绝新的连接并断开连接。

尽管如此,页面刷新(自动连接)会增加RAM。我经常看了很多次,看我是不是要发布一些东西,但据我所知,一切都应该由范围管理,所以我不知道它是什么泄漏。

但是,一旦我添加了New Relic,我就注意到了一些奇怪的行为。首先,一旦Sleepychat达到512MB的限制,Heroku将报告内存限制达到错误,但New Relic将显示为已释放大块(~100MB)。尽管如此,Heroku稍后会报告其下一个错误的使用率更高。其次,New Relic报告每当我使用Node Inspector记录堆分配时内存使用量会下降,但是一旦我停止录制就会立即恢复。

这是来自Node Inspector的快照文件(实际上是分配时间轴)。 10秒钟,当我开始垃圾邮件页面刷新。此外,这里是New Relic报道的图像。

快照:Snapshot File

New Relic:

我不知道发生了什么。有人有什么想法吗?

0 个答案:

没有答案