我有三个应用程序互相交谈。Websocket服务器(1)接受来自浏览器的连接,解析url以查看需要哪些数据,如果内存中有数据,则将其提供给客户端,如果没有,则从另一个称为“提取程序”(fetcher)的应用程序中请求它。Fetcher接收此作业,从简单的API(3)请求该作业,该API返回JSON数据,并将其发送回websocker服务器,然后将其发布到连接的客户端。然后,“ Fetcher”开始定期检查该url / job是否有更新,并将新数据发送到websocket服务器。
我使用socket.io进行客户端Websocket服务器通信。Websocket服务器和访存器通过ZMQ套接字进行对话。
我通过130个连接加载测试websocket服务器。Websocket服务器每秒将160KB的数据发布给130个客户端。最初,它使用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,因此欢迎提出任何意见,谢谢