Socket.io: 连接的客户端/插槽数

创建于 2011-08-14  ·  53评论  ·  资料来源: socketio/socket.io

你好

我正在使用io.sockets.clients().length来获取当前连接的所有客户端的计数,但是一段时间之后,这个数字越来越高,此阵列中仍然存在许多断开连接的客户端。

io.sockets.clients().length的图片下面,每5分钟绘制一次,持续24小时。 一旦计数超过2k,我就重新启动服务器,大约200至300个客户端重新连接,这是正确的计数。

Connected Clients

这是获取所有已连接客户端计数的错误方法吗? 我还尝试手动计算连接和断开连接的数量,但是一天后断开连接的数量多于连接数量,则计数为负。

相关: https :

Performance bug

最有用的评论

L2C FAF IT RTFM !!!
░░░░░▄▄▄▄▀▀▀▀▀▀▀▀▄▄▄▄▄▄░░░░░░░░
░░░░░█░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒░░▀▀▄░░░░
░░░░█░░░▒▒▒▒▒▒░░░░░░░░▒▒▒░░█░░░
░░░█░░░░░░▄██▀▄▄░░░░░▄▄▄░░░░█░░
░▄▀▒▄▄▄▒░█▀▀▀▀▄▄█░░░██▄▄█░░░░█░
█░▒█▒▄░▀▄▄▄▀░░░░░░░░█░░░▒▒▒▒▒▒░█
█░▒█░█▀▄▄░░░░░█▀░░░░▀▄░░▄▀▀▀▄▒█
░█░▀▄░█▄░█▀▄▄░▀░▀▀░▄▄▀░░░░█░░█░
░░█░░░▀▄▀█▄▄░█▀▀▀▄▄▄▄▀▀█▀██░█░░
░░░█░░░░██░░▀█▄▄▄█▄▄█▄████░█░░░
░░░░█░░░░▀▀▄░█░░░█░█▀██████░█░
░░░░░▀▄░░░░░▀▀▄▄▄█▄█▄█▄█▄▀░░█░░
░░░░░░░▀▄▄░▒▒▒▒░░░░░░░░░░▒░░░█░
▒▒▒▒▒▒▒▒▒▒▒░░░░█░
░░░░░░░░░░░░░░▀▄▄▄▄▄░░░░░░░░█░░
░░░░░░░░░░░░░░░░░░░░▀▀▀▀▀▀▀▀░░░

所有53条评论

+1。 我认为对于我来说,这是导致内存问题(一直增长到分段错误)的最后一个问题。

是的,每天崩溃两次,并出现分段错误。

它在“文档”中指出:
http://labs.learnboost.com/socket.io/

在Socket.IO Node.JS服务器/侦听器部分下(在页面内搜索“接头”)。 去引用:

“客户端数组。重要提示:断开连接的客户端设置为null,不进行拼接。”

从思想到代码再到文档,这意味着必须有一些原因才能使断开连接的用户不会从该数组中删除,我只是无法猜测原因是什么。 最好的情况是,它使跟踪CONNECTED用户变得很痛苦,最坏的情况是导致node.js / socket.io服务器实现中缺乏稳定性。

标记为性能错误。

我也有同样的问题。

并且我使我的数字基于某个变量,其中在连接事件期间我为+1,在断开连接期间为-1。 (所以这不是空问题)

用户数:

https://skitch.com/tomekotomek/f4867/dock

中央处理器:

https://skitch.com/tomekotomek/f489w/dock

记忆:

https://skitch.com/tomekotomek/f4eyy/graph.php-747x374

顺便说一句。

不仅仅是性能问题,它还只是将我们的正常运行时间减少到不到一周。

我弄清楚如何做到这一点的方法是使用Redis的一组客户端ID,在socket.io上添加connect,并在断开连接时从该set中删除。 SCARD命令为您提供了连接的客户端数和SMEMBERS的所有ID。

是的,需要清除阵列,或者需要找到更好的方法来容纳客户端。

+1

+1

+1
这绝对不仅仅是数组长度的问题。
在连接/断开连接上增加和减少计数器仍会导致计数器不断增加。

+1

+1

+1

+1

+1

有没有人试图将其隔离到各种交通工具? IE浏览器是否工作原理相同
websocket,flashsocket,xhr-polling等

这绝对是一个重要的问题,因为如果不重新启动我们就无法使服务器持续运行。 随着内存的不断增长,我什至没有一天至少要重启一次。 注意:在节点0.4。*中,内存对我来说更好。

+1

我发现了同样的问题-我的记忆刚满。 每分钟约1 mb

大约有1500个套接字,这些套接字由于单击站点波浪形而重新连接。

由于内存泄漏,必须每天重启一次

L2C FAF IT RTFM !!!
░░░░░▄▄▄▄▀▀▀▀▀▀▀▀▄▄▄▄▄▄░░░░░░░░
░░░░░█░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒░░▀▀▄░░░░
░░░░█░░░▒▒▒▒▒▒░░░░░░░░▒▒▒░░█░░░
░░░█░░░░░░▄██▀▄▄░░░░░▄▄▄░░░░█░░
░▄▀▒▄▄▄▒░█▀▀▀▀▄▄█░░░██▄▄█░░░░█░
█░▒█▒▄░▀▄▄▄▀░░░░░░░░█░░░▒▒▒▒▒▒░█
█░▒█░█▀▄▄░░░░░█▀░░░░▀▄░░▄▀▀▀▄▒█
░█░▀▄░█▄░█▀▄▄░▀░▀▀░▄▄▀░░░░█░░█░
░░█░░░▀▄▀█▄▄░█▀▀▀▄▄▄▄▀▀█▀██░█░░
░░░█░░░░██░░▀█▄▄▄█▄▄█▄████░█░░░
░░░░█░░░░▀▀▄░█░░░█░█▀██████░█░
░░░░░▀▄░░░░░▀▀▄▄▄█▄█▄█▄█▄▀░░█░░
░░░░░░░▀▄▄░▒▒▒▒░░░░░░░░░░▒░░░█░
▒▒▒▒▒▒▒▒▒▒▒░░░░█░
░░░░░░░░░░░░░░▀▄▄▄▄▄░░░░░░░░█░░
░░░░░░░░░░░░░░░░░░░░▀▀▀▀▀▀▀▀░░░

我只是关闭了flashsocket传输服务器端和内存使用率,而CPU使用率则更好。 其他人可以尝试一下,看看是否有帮助?

+1

我将其收回,CPU更好,但内存仍然缓慢泄漏。 我认为这是因为闪存策略服务器已关闭?

请停止使用“ +1”来使Feed膨胀,这既不是Google plus也不是Facebook ...

老兄,我必须做到+1

下方也有此问题的禁用通知

就我而言,socket.manager.closed,socket.manager.handshaken比socket.manager.open更重要。 而且我不知道如何清除无用的连接

在这里完全一样。 我们每天必须重启服务器多次,因为连接消耗越来越多的内存,直到4GB内存用完为止。
如果此问题解决,我将非常高兴,因为如果必须每隔几个小时重新启动一次,我将无法继续使用socket.io。 (我们同时拥有约2000个在线用户,可以连接和断开连接)

我正在使用socket.io 0.9.10和以下代码来确定套接字的数量:

var socketIO = require('socket.io')。listen(.....
...
var numberOfSockets = Object.keys(socketIO.connected).length;

不确定这个数字对各种极端情况的反应有多精确,但是直到现在看来都是准确的:每个连接的浏览器都会增加这个数字,每个关闭的浏览器都会减少这个数字。

这种方法有什么问题吗?

撇开计数问题(可以解决),这里的内存问题非常残酷。 将来是否有希望解决此问题? 这意味着长时间运行,高活动性的socket.io部署非常难以管理。

或者,是否有人知道已解决此问题的前叉?

该问题与以下代码有关(取自socket.io 0.9.10):

  SocketNamespace.prototype.clients = function (room) {
    var room = this.name + (room !== undefined ? '/' + room : '');

     if (!this.manager.rooms[room]) {
         return [];
     }

     return this.manager.rooms[room].map(function (id) {
         return this.socket(id);
     }, this);
  };

方法this.socket(id)创建套接字的新实例,因此在每个套接字连接上使用该实例都会产生内存泄漏。

@dknaus为此提供了出色的解决方法;)

@outbounder您能指出那个出色的解决方法实际上是什么吗? 因为我在该线程中看到的只是一个活动的套接字数

@marksyzm

 Object.keys(socketIO.connected).length;

仅当您将存储附加到socketio时,此选项才有效。 否则,唯一的方法是通过自定义逻辑对它们进行计数,如下所示:

 io.on("connection", function(s){ 
   connectedCount += 1; 
   s.on("disconnect", function(){
     connectedCount -= 1;
   });
 });

@outbounder,但我认为此错误的关键是要解决套接字未断开而导致的内存泄漏问题? 我想念什么吗?

记忆从某处流出来

https://github.com/LearnBoost/socket.io/issues/1015

https://github.com/sockjs/sockjs-node/issues/81

https://github.com/joyent/node/issues/2328#issuecomment -3190337

不确定其websocket是否相关或节点相关或两者均相关

sockjs也有类似的问题-这意味着socket.io和sockjs可能使用相同的ws lib(节点有问题)-或只是一个普通的节点问题

+1

在生产中,这仍然发生在我身上。 我什至没有那么多连接的客户端,实际上-高峰时为100-200。 进程即将耗尽内存并挂死。 有人在处理此内存泄漏吗? 有什么可以帮忙的吗?

据我所知,这是很久以来的已知问题,每个有志于实际部署的人都已经脱离了socket.io。 在这个问题上没有动静,而且engine.io似乎根本没有弄乱传输核心,因此也没有理由指望它能解决这个问题。

坦率地说,我一直在寻找证据,证明有人在生产中使用了活动的websocket传输部署了vanilla socket.io,但还没有找到可靠的报告。 Trello是一个引人注目的用户,但他们已经承认使用了某种未发布的修补版本,仅使用websocket传输(这时为什么要完全使用socket.io?)。 我完全退出了socket.io,因为看来这不会很快改变。 我不能保证sockjs不会有问题,但是我很肯定,如果您加入/留下数千个客户端,它不会像socket.io一样快失败。

我只是在Nodejitsu上的我自己的socket.io/redis应用程序中尝试解决这个问题。 看起来好像是socket.io的Redis商店。 我想我将切换到SockJS并编写自己的Redis管理。

#nodejitsu支持频道中有关我的聊天记录:
https://gist.github.com/4146668

+1

是我,还是socket.io不再使用redis?

如何添加this.store.publish('disconnect',id); 到Manager.prototype.onClientDisconnect
如此处建议的那样: https :

添加此行是否会有任何问题? 我想知道。

第二个?

+1

+1

任何人?

在这个问题上有什么动静吗? 我希望在不久的将来进行部署,并且非常重视生产部署人员对此问题的任何见解。

进行上述修复对我们有用...负载显着下降
2013年6月4日上午11:01,“ patrickod” [email protected]写道:

在这个问题上有什么动静吗? 我希望在不久的将来进行部署,
真的很重视生产部署人员拥有的任何见解
在这个问题上。

-
直接回复此电子邮件或在Gi tHub上查看它

禁用闪存插槽支持? 该文档说,现在默认情况下已完成。

我从未遇到过这个问题,但我仍在开发和基准测试中。 这已经解决了吗?

你告诉我们。 您正在做基准测试。 :D

在2014年1月23日星期四上午7:07,Maziyar Panahi [email protected]

我从未遇到过这个问题,但我仍在开发和基准测试中。
这已经解决了吗?

-
直接回复此电子邮件或在Gi tHub上查看它

你告诉我们。 您正在做基准测试。 :D

老实说,我没注意到有大量的下降。 当我同时连接1000个用户时,我看到很少有连接在5 6分钟后断开,但是它们重新连接的速度非常快,并且每秒向所有用户发送超过1万条消息。 因此,我认为我的EC2实例(m1.large)不够强大,无法让它们全部存活而又没有丢失。
我想知道我将来是否会遇到这个问题。 我的只是掉了几下,然后在压力测试中重新连接它们。 断开所有连接后,我可以看到客户数降为0。

+1

从10.11开始我就没有遇到任何问题...我可能会把它归结为使用ubuntu 10.10? 无论哪种方式,现在看起来都还可以。

此页面是否有帮助?
0 / 5 - 0 等级