Максимальное количество одновременных подключений 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.