使用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