Максимальное количество одновременных подключений Socket.IO


125

Этот вопрос задавался ранее, но не недавно, и на него нет четкого ответа.

Имеется ли при использовании Socket.io максимальное количество одновременных подключений, которое можно поддерживать, прежде чем вам понадобится добавить еще один сервер?

Кто-нибудь знает какие-либо активные производственные среды, в которых массово используются веб-сокеты (особенно socket.io)? Я действительно хотел бы знать, какая конфигурация лучше всего подходит для максимального количества подключений?

Поскольку веб-сокеты построены на основе TCP, я понимаю, что если порты не используются совместно между соединениями, вы будете ограничены лимитом порта в 64 КБ. Но я также видел сообщения о 512К-соединениях с использованием Gretty . Так что не знаю.


3
Trello массово использует сокеты (в частности, socket.io).
Джеймс

Я читал, что Trello пришлось изменить код Socket.io из-за ограничения в 10 000 подключений, и они смогли поддерживать «многие тысячи» подключений перед добавлением серверов. По-прежнему огромная пропасть между этим и 512 КБ других серверных систем.
Эндрю

1
А сколько лет этой статье? Совсем недавно Trello достиг более 1 миллиона активных пользователей в месяц, поэтому я могу предположить, что сейчас у них более 10 000 активных сокетов. Trello использует Redis для обеспечения масштабируемости поверх socket.io
Джеймс

2
У Trello сейчас, по-видимому, более 4 миллионов пользователей, но наверняка они используют это на большом количестве серверов, верно? Это возвращает меня к моему первоначальному вопросу: каково их (или у кого-либо еще) пиковое количество одновременных пользователей на сервере? Также было бы хорошо знать, какой сервер / контейнер они используют. И они все еще используют собственный форк, или они вернулись к источнику / мастеру? Моя единственная цель, задавая этот вопрос, заключалась в том, чтобы попытаться оценить, может ли моя компания (в то время) позволить себе поддерживать приложение Socket.io примерно для 120000 одновременных подключений.
Эндрю

1
Что касается лимита порта, я думаю , что объяснение , почему это не является проблемой , объясняется здесь . По сути, в вашей системе используется только тот порт, который вы слушаете. Сокеты создаются для каждого соединения, и они используют дескрипторы файлов, но не используют порты на вашем компьютере.
Paul Lynch

Ответы:


78

Эта статья может помочь вам в этом: http://drewww.github.io/socket.io-benchmarking/

У меня возник тот же вопрос, поэтому я написал небольшой тест (с использованием XHR-опроса), чтобы увидеть, когда соединения начали отказывать (или отставать). Я обнаружил (в моем случае), что сокеты начали действовать примерно при 1400-1800 одновременных подключениях.

Это краткое содержание, которое я сделал, похожий на тест, который я использовал: https://gist.github.com/jmyrland/5535279


7
Я понимаю, что это более старая тема, но я сначала нашел ее, когда искал вопрос к моему ответу, и в конечном итоге обнаружил, что это полезно: rtcamp.com/tutorials/linux/increase-open-files-limit Ограничение количества открытых файлов для каждого процесса может по умолчанию установлено мягкое ограничение 1024 и жесткое ограничение 4096, и поскольку каждый открытый TCP-порт представляет файл, важно учитывать эти ограничения при определении количества открытых сокетов, разрешенных машиной, прежде чем пытаться максимально использовать библиотеку.
DeeperID

2
@JAM Вы когда-нибудь обнаруживали, почему ваши веб-сокеты срабатывают около 1400-1800 подключений? У меня такая же проблема, и мои ограничения на файлы установлены на 100000, поэтому я знаю, что проблема не в этом. Любая помощь будет принята с благодарностью. Спасибо.
Сет,

@seth: прошло много времени с тех пор, как я последний раз просматривал это, но я думаю, что это был вывод: опрос XHR занял слишком много ресурсов (по сравнению с другими методами транспортировки). При использовании веб-сокетов количество одновременных подключений было больше.
JAM

@JAM спасибо за ответ. Я наблюдаю те же проблемы с использованием модуля ws, а не socket.io, поэтому не должно быть никакого опроса XHR с модулем ws. Вот где у меня проблемы с устранением неполадок. Поиск продолжается.
Сет,

Это хороший чистый ответ .. Также правильный, в зависимости от конкретного случая .. Лично я предлагаю людям написать свои собственные тесты или симулятор подключения. Хотя тест для кого-то еще может быть хорош, он не отражает реальную среду ... Если у вас есть симулятор клиента, способный обрабатывать любое количество клиентов с различными реальными сбоями ... Вы можете выполнить эталонную оценку после серьезных изменений, а также обновляйте свой симулятор по мере продвижения. Работа с интерфейсом пользовательского чата будет отличаться от мониторинга браузера пользователей и так далее .. Python, я нашел очень удобным создать сценарий для симулятора ...
Angry 84

16

Я пытался использовать socket.io на AWS, я могу поддерживать стабильными около 600 подключений.

И я выяснил, что это связано с тем, что socket.io сначала использовал длинный опрос, а потом перешел на websocket.

после того, как я установил конфигурацию для использования только веб-сокета, я могу сохранить около 9000 подключений.

Установите эту конфигурацию на стороне клиента:

const socket = require('socket.io-client')
const conn = socket(host, { upgrade: false, transports: ['websocket'] })

3
вы использовали EC2, какой экземпляр? t2.micro, t2.nano?
bvdb

2
Вы заметили разницу в скорости отклика при принудительном использовании веб-сокетов?
Лорен

Вы знаете, какого размера был ваш экземпляр? Также просто чтобы кто-нибудь в будущем знал, что некоторые старые браузеры не поддерживают WebSockets, поэтому обновление может быть важным для некоторых.
Райан Содерберг

Как мы можем проверить, сколько соединений поддерживает сервер? Как вы измерили 9000 подключений? Пожалуйста, предложите ..
Любопытный разработчик

15

Кажется, этому парню удалось установить более 1 миллиона одновременных подключений на одном сервере Node.js.

http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/

Мне не совсем ясно, сколько портов он использовал.


13
Думаю, не с socket.io и даже не с веб-сокетами. Парень, похоже, использовал длительный опрос, который, как я полагаю, требует меньше ресурсов.
Тим 333,

6

Для + 300к одновременного подключения:

Установите эти переменные в /etc/sysctl.conf:

fs.file-max = 10000000 
fs.nr_open = 10000000

Также измените эти переменные в /etc/security/limits.conf:

* soft nofile 10000000
* hard nofile 10000000
root soft nofile 10000000
root hard nofile 10000000

И, наконец, увеличьте также буферы TCP /etc/sysctl.conf:

net.ipv4.tcp_mem = 786432 1697152 1945728
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216

для получения дополнительной информации посетите https://www.linangran.com/?p=547


как проверить, работают ли наши изменения?
Любопытный разработчик,

1

После настройки вы можете проверить, написав эту команду в терминале

sysctl -a | grep file
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.