Socket.io: Количество подключенных клиентов / сокетов

Созданный на 14 авг. 2011  ·  53Комментарии  ·  Источник: socketio/socket.io

Привет,

Я использую io.sockets.clients().length для подсчета всех подключенных в данный момент клиентов, но через некоторое время это число становится слишком высоким, многие отключенные клиенты все еще присутствуют в этом массиве.

Ниже изображение io.sockets.clients().length , построенное каждые 5 минут в течение 24 часов. Когда счетчик превысил ~ 2 КБ, я перезапустил сервер, снова подключилось от 200 до 300 клиентов, что является правильным количеством.

Connected Clients

Это неправильный способ подсчета всех подключенных клиентов? Я также попытался подсчитать подключения и отключения вручную, но через день отключений было больше, чем подключений, счет был отрицательным.

Связанный: https://github.com/LearnBoost/socket.io/issues/349

Performance bug

Самый полезный комментарий

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

Все 53 Комментарий

+1. Я думаю, что в моем случае это последняя проблема, вызывающая проблемы с памятью (рост до ошибки сегментации).

Да, здесь происходит сбой примерно два раза в день из-за ошибки сегментации.

это отмечено в «документации»:
http://labs.learnboost.com/socket.io/

в разделе Socket.IO Node.JS server / Listener (выполните поиск на странице по запросу "splice"). Цитировать:

«Массив клиентов. Важно: отключенные клиенты имеют значение NULL, массив не склеен».

Чтобы перейти от мысли к коду в документацию, значит, должна быть какая-то причина, по которой отключенный пользователь не удаляется из этого массива, я просто не могу догадаться, что это за причина. В лучшем случае это затрудняет отслеживание ПОДКЛЮЧЕННЫХ пользователей, а в худшем - способствует отсутствию стабильности в реализации сервера node.js / socket.io.

Помечено как ошибка производительности.

у меня та же проблема.

и я основываю свой номер на некоторой переменной с i +1 во время события подключения и -1 во время отключения. (так что это не нулевая проблема)

Количество пользователей:

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

ПРОЦЕССОР:

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

ОБЪЕМ ПАМЯТИ:

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

Кстати.

это больше, чем проблема производительности, это просто снижает время безотказной работы до менее чем одной недели.

Я решил, как это сделать, - использовать набор идентификаторов клиентов Redis, добавить соединение socket.io и удалить из набора при отключении. Команда SCARD дает вам количество подключенных клиентов и SMEMBERS все идентификаторы.

да, массив нужно очистить или найти лучший способ удержания клиентов.

+1

+1

+1
Это определенно больше, чем просто проблема длины массива.
Увеличение и уменьшение счетчика при подключении / отключении по-прежнему будет приводить к постоянно увеличивающемуся счетчику.

+1

+1

+1

+1

+1

Кто-нибудь пробовал изолировать это от различных транспортов? IE Посмотрите, работает ли он так же в
websocket, flashsocket, xhr-polling и т. д.

Это определенно важная проблема, поскольку мы не можем оставить сервер постоянно работающим без перезапуска. Я не могу прожить ни дня без хотя бы одного перезапуска, так как память продолжает расти. ПРИМЕЧАНИЕ. В узле 0.4. * Память для меня НАМНОГО ЛУЧШЕ.

+1

Я обнаружил ту же проблему - моя память просто переполняется. около 1 мб / в минуту

примерно с 1500 сокетами, которые повторно подключаются из-за щелчков по сайту.

его необходимо перезапускать ежедневно из-за утечки памяти

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

Я только что отключил транспортный сервер flashsocket, и использование памяти И использование процессора НАМНОГО ЛУЧШЕ. Может ли кто-нибудь еще попробовать это и посмотреть, поможет ли это?

+1

Беру обратно, ЦП ЛУЧШЕ, но память все равно медленно просачивается. Я предполагаю, что это потому, что сервер политики флэш-памяти отключился?

Пожалуйста, прекратите раздувать ленту «+1», это не Google Plus и не Facebook ...

человек, я должен сделать это +1 к этому

также есть отключение уведомлений для этой проблемы ниже

В моем случае socket.manager.closed, socket.manager.handshaken больше, чем socket.manager.open. и не знаю как очистить бесполезные соединения

ТОЧНО то же самое и здесь. Мы должны перезапускать сервер столько раз в день, потому что соединения съедают все больше и больше памяти, пока у нас не закончится 4 ГБ памяти.
Я буду очень рад, если эта проблема будет решена, потому что я не могу продолжать использовать 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

Не уверен, связан ли его веб-узел или узел, или оба

sockjs имеет аналогичные проблемы - это означает, что либо socket.io, либо sockjs могут использовать одну и ту же ws lib, у которой есть проблема с узлом, либо это просто общий узел.

+1

Это все еще происходит со мной в производстве. У меня даже не так много подключенных клиентов, действительно - 100-200 в пике. Процессам просто не хватает памяти, они зависают или умирают. Кто-нибудь работает над этой утечкой памяти? Чем я могу помочь?

Насколько я могу судить, это была известная проблема на протяжении многих лет, и все, кто хотел развернуть ее, ушли с socket.io. По этой проблеме не было никакого движения, и engine.io, похоже, вообще не вмешивается в транспортные ядра, поэтому нет причин ожидать, что это когда-либо исправит.

Честно говоря, я искал доказательства того, что ЛЮБОЙ разворачивает vanilla socket.io в производстве с активным транспортом websocket, и не нашел никаких надежных отчетов. Trello - высокопрофессиональный пользователь, но они признались, что использовали какую-то исправленную версию, которая еще не выпущена и использует только транспорт веб-сокетов (в этот момент зачем вообще использовать socket.io?). Я полностью отказался от socket.io, потому что не похоже, что это скоро изменится. Я не могу обещать, что у sockjs нет проблем, но я уверен, что он не выйдет из строя почти так же быстро, как socket.io, если вы присоединитесь / оставите несколько тысяч клиентов.

Я просто боролся с этой проблемой в моем собственном приложении socket.io/redis на Nodejitsu. Это определенно похоже на магазин Redis на socket.io. Думаю, я собираюсь перейти на SockJS и написать свое собственное управление Redis.

Журналы чатов, в которых я работал над этим, в канале поддержки #nodejitsu:
https://gist.github.com/4146668

+1

Это я, или socket.io больше не использует redis?

Как насчет добавления this.store.publish ('отключить', id); в Manager.prototype.onClientDisconnect
как предлагается здесь: https://github.com/LearnBoost/socket.io/issues/831

Не будет ли проблем с добавлением этой строчки ?? Я хочу знать.

Второй что?

+1

+1

Кто угодно?

Есть какие-нибудь движения по этому поводу? Я надеюсь выполнить развертывание в ближайшем будущем и буду очень признателен за любое понимание этой проблемы у людей с производственным развертыванием.

Исправление выше сработало для нас ... нагрузка значительно упала
4 июня 2013 г. в 11:01 "patrickod" [email protected] написал:

Есть какие-нибудь движения по этому поводу? Я надеюсь развернуть в ближайшем будущем и
действительно ценит любое понимание, которое есть у людей с производственным развертыванием
по этому вопросу.

-
Ответьте на это письмо напрямую или просмотрите его на Gi tHubhttps: //github.com/LearnBoost/socket.io/issues/463#issuecomment -18927408
.

Отключение поддержки флеш-сокета? В документации сказано, что теперь это делается по умолчанию.

Я никогда не сталкивался с этой проблемой, но я все еще в разработке и тестировании. С этим разобрались?

Вы нам скажите. Вы проводите сравнительный анализ. : D

В четверг, 23 января 2014 г., в 7:07, Мазияр Панахи [email protected] написал:

Я никогда не сталкивался с этой проблемой, но я все еще в разработке и тестировании.
С этим разобрались?

-
Ответьте на это письмо напрямую или просмотрите его на Gi tHubhttps: //github.com/LearnBoost/socket.io/issues/463#issuecomment -33126062
.

Вы нам скажите. Вы проводите сравнительный анализ. : D

Честно говоря, я не заметил, что падают в большом количестве. Я видел, как несколько соединений прерываются через 5–6 минут, когда я подключаю 1000 пользователей одновременно, но они восстанавливаются очень быстро, и у меня более 10К сообщений в секунду для всех пользователей. Так что я думаю, что мой экземпляр EC2 (m1.large) просто недостаточно силен, чтобы сохранить их всех в живых, не уронив несколько.
Мне было интересно, столкнусь ли я с этой проблемой в будущем. Моя просто бросает несколько и повторно подключает их в стресс-тесте. После отключения всего я вижу, что количество клиентов падает до 0.

+1

У меня не было проблем со всем этим с 10.11 ... Можно было бы списать это на использование ubuntu 10.10? В любом случае, теперь все в порядке.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги