Максимальное количество одновременных соединений Socket.IO
Этот вопрос задавался ранее, но не недавно и не дал четкого ответа.
Используя Socket.io, существует ли максимальное количество одновременных соединений, которое можно поддерживать, прежде чем вам нужно будет добавить другой сервер?
Кто-нибудь знает какие-либо активные производственные среды, в которых массово используются веб-сокеты (особенно socket.io)? Мне бы очень хотелось узнать, какая настройка лучше всего подходит для максимальных соединений?
Поскольку веб-сокеты построены на основе TCP, я понимаю, что если порты не являются общими для всех подключений, вы будете ограничены портом в 64 КБ. Но я также видел сообщения о 512K-соединениях с использованием Gretty. Так что я не знаю.
6 ответов
Эта статья может помочь вам в этом: http://drewww.github.io/socket.io-benchmarking/
Мне был интересен тот же вопрос, и я закончил тем, что написал небольшой тест (с использованием XHR-опроса), чтобы увидеть, когда соединения начали обрываться (или отставать). Я обнаружил (в моем случае), что сокеты начали работать примерно при 1400-1800 одновременных подключений.
Это короткая суть, которую я сделал, похож на тест, который я использовал: https://gist.github.com/jmyrland/5535279
Я попытался использовать socket.io в AWS, я могу максимально поддерживать стабильное соединение около 600.
И я узнал, что это потому, что socket.io сначала использовал длинные опросы, а позже обновил их до websocket.
после того, как я настроил конфигурацию на использование только websocket, я смогу сохранить около 9000 соединений.
Установите этот конфиг на стороне клиента:
const socket = require('socket.io-client')
const conn = socket(host, { upgrade: false, transports: ['websocket'] })
Для +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 миллиона одновременных подключений на одном сервере Node.js.
http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/
Мне не совсем ясно, сколько портов он использовал.
Я хотел бы дать еще один ответ в 2023 году.
Мы используем веб-сокет только в socket.io-client. Мы провели 2 типа тестов производительности,
моя тестовая группа использует JMeter для тестирования до 5000 одновременных подключений. В силу специфики нашего продукта нам достаточно 5000 подключений, поэтому выше мы не стали.
Я использую https://a.testable.io/ для другого теста производительности. Причина, по которой я использую testable (это НЕ рекламный ход для них, лол), заключается в том, что я могу выбирать клиентов ws из разных мест, например, я выбрал 3 разных места в Северной Америке и одно место в Азии. Я считаю, что это было бы более близко к реальному сценарию, чем я просто запускаю тестовый скрипт с моей локальной машины (которая у меня тоже есть). Выполнение такого рода теста стоило денег, цитируя слова их технической поддержки после того, как я провел свой тест: «Я вижу, вы сегодня успешно провели тест на 20 000 пользователей, отлично! Менее 20 долларов за тест такого размера, безусловно, лучший цены там :)».
Кстати, вы также можете обратиться к https://ably.com/topic/scaling-socketio , где я могу найти последнюю опубликованную статью о производительности socket.io.
Итак, в заключение я бы сказал, что если вы используете только веб-сокет, от 5000 до 10 000 одновременных подключений не должно быть сложно достичь.
После настройки вы можете проверить, написав эту команду в терминале
sysctl -a | grep file