我有三个应用程序互相交谈.一个websocket服务器(1)接受来自浏览器的连接,解析url以查看所需的数据,如果它有内存中的数据,则将其提供给客户端,如果不是从另一个名为"fetcher"的应用程序请求它(2).Fetcher接收此作业,从返回JSON数据的简单API(3)请求它,并将其发送回websocker服务器,后者将其发布到连接的客户端.然后,"Fetcher"开始定期检查该url/job是否有更新,并在发生新数据时将其发送到websocket服务器.
我使用socket.io进行客户端 - websocket服务器通信.Websocket服务器和fetcher通过ZMQ套接字进行会谈.
我用130个连接加载测试websocket服务器.Websocket服务器每秒向130个客户端发布160KB的数据.最初,它使用170mb的RAM连接130个,但很快就增加到1GB,尽管没有新的连接.然后socket.io的心跳信号开始失败,导致连接断开.
我使用Nodetime来获取堆快照.在第130个客户端连接之后,这是内存的外观:
346缓冲区对象,总共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]); });
我的所有代码(包括负载测试)都是公共的,您可以在此处找到此Web套接字服务器:https://github.com/denizozger/node-socketio/blob/master/server.js请参阅第138行.
两个月前我开始学习Javascript和Node.js所以欢迎提出任何意见,谢谢!