Привет,
Я использую io.sockets.clients().length
для подсчета всех подключенных в данный момент клиентов, но через некоторое время это число становится слишком высоким, многие отключенные клиенты все еще присутствуют в этом массиве.
Ниже изображение io.sockets.clients().length
, построенное каждые 5 минут в течение 24 часов. Когда счетчик превысил ~ 2 КБ, я перезапустил сервер, снова подключилось от 200 до 300 клиентов, что является правильным количеством.
Это неправильный способ подсчета всех подключенных клиентов? Я также попытался подсчитать подключения и отключения вручную, но через день отключений было больше, чем подключений, счет был отрицательным.
Связанный: https://github.com/LearnBoost/socket.io/issues/349
+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? В любом случае, теперь все в порядке.
Самый полезный комментарий
L2C FAF IT RTFM !!!
░░░░░▄▄▄▄▀▀▀▀▀▀▀▀▄▄▄▄▄▄░░░░░░░░
░░░░░█
░░░░█░░░▒▒▒▒▒▒░░░░░░░░▒▒▒░░█░░░
░░░█░░░░░░▄██▀▄▄░░░░░▄▄▄░░░░█░░
░▄▀▒▄▄▄▒░█▀▀▀▀▄▄█░░░██▄▄█░░░░█░
█░▒█▒▄░▀▄▄▄▀░░░░░░░░█░░░▒▒▒▒▒░█
█░▒█░█▀▄▄░░░░░█▀░░░░▀▄░░▄▀▀▀▄▒█
░█░▀▄░█▄░█▀▄▄░▀░▀▀░▄▄▀░░░░█░░█░
░░█░░░▀▄▀█▄▄░█▀▀▀▄▄▄▄▀▀█▀██░█░░
░░░█░░░░██░░▀█▄▄▄█▄▄█▄████░█░░░
░░░░█░░░░▀▀▄░█░░░█░█▀██████░█░░
░░░░░▀▄░░░░░▀▀▄▄▄█▄█▄█▄█▄▀░░█░░
░░░░░░░▀▄▄░▒▒▒▒░░░░░░░░░░▒░░░█
░░░░░░░░░░▀▀▄▄░▒▒▒▒▒▒▒▒▒▒░░░░█
░░░░░░░░░░░░░░▀▄▄▄▄▄░░░░░░░░█
░░░░░░░░░░░░░░░░░░░░▀▀▀▀▀▀▀▀░░░