使用Socket.IO + Node.js + ZMQ发送消息时发生内存泄漏

我有三个应用程序互相交谈。 Websocket服务器(1)接受来自浏览器的连接,parsingurl以查看需要什么数据,如果它有内存中的数据则将其提供给客户端,如果不从另一个名为“fetcher”的应用程序请求它(2)。 Fetcher接收到这个作业,从一个简单的API(3)请求它返回JSON数据,并将其发送回websocker服务器,并将其发布到连接的客户端。 然后“Fetcher”开始定期检查是否有更新到该URL /作业,并发送新的数据到websocket服务器。

我使用socket.io进行client-websocket服务器通信。 Websocket服务器和fetcher通过ZMQ套接字进行通信

我用130个连接加载testingwebsocket服务器。 Websocket服务器每秒向130个客户端发布160KB的数据。 一开始,它为130个连接使用了170MB的内存,但是很快就增加到了1GB,尽pipe没有新的连接。 然后socket.io的心跳信号开始失败,导致连接丢失。

我使用Nodetime来获取堆快照。 在第130个客户端连接之后,下面是内存的外观:

在这里输入图像说明

共有44MB的 缓冲区对象

在四分钟内,Buffer对象的数量急剧增加(再次没有新的连接):其中有3012个,总内存为486MB 。 再过10分钟后,总共有3535个内存消耗总量为573MB

我用Mozilla的memwatch找出哪行增加了内存,发现是这个函数:

function notifyObservers(resourceId) { var data = resourceData[resourceId]; io.sockets.in(resourceId).emit('data', data); } 

如果我注释这些行,内存使用保持不变,这是另一个确认。

任何想法如何发生? 我在ZMQ的订阅者套接字方法里面调用了这个函数,我怀疑它和这个有关系。如果我删除了函数并将它们合并成一个,

 // Receive new resource data const resourceUpdatedSubscriber = zmq.socket('sub').connect('tcp://localhost:5433'); resourceUpdatedSubscriber.subscribe(''); resourceUpdatedSubscriber.on('message', function (data) { var resource = JSON.parse(data); resourceData[resource.id] = resource.data; io.sockets.in(resourceId).emit('data', resourceData[resource.id]); }); 

我所有的代码(包括负载testing)都是公开的,你可以在这里find这个Web套接字服务器: https : //github.com/denizozger/node-socketio/blob/master/server.js见138行。

我两个月前开始学习Javascript和Node.js,所以有任何意见,欢迎提前致谢!

NodeJs可能会使用Windows套接字API(包括内存泄漏,已知的老bug) https://connect.microsoft.com/VisualStudio/feedback/details/605621/winsock-c-program-causes-memory-leak

问题是WSACleanup将永远不会被调用,直到您closuresnetworking服务。 (混合ZMQ或Nodejs不会改变这个事实)

现在,随着时间的推移,你将locking更多的内存页面,并且在第一个内存页面满了之后,这个通知会增加。

也许尝试添加

 var resourceData; 

在你的代码的某处,因为也许你的内存泄漏必须与全局

在这里阅读更多有关全局variables的信息: https : //gist.github.com/hallettj/64478