- Оригинальный адрес:Millions of active WebSockets with Node.js
- Оригинальный автор:Alex Hultman
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:Mirosalva
- Корректор:portandbridge,sunui
Множество сервисов WebSocket, использующих только потребительский ноутбук и некоторые ресурсы Wi-Fi.
Проект через последнюю версию веб-сервиса TypeScriptuWebSockets.js, мы видим, что это не только повышает производительность, но и улучшает использование памяти. Это особенно актуально для пользователей Node.js, поэтому для демонстрации я хотел провести крупномасштабное тестирование в реальной среде.
Мы планируем использовать, я купил 6-летний ноутбук, который имеет 8 ГБ, используя память и сетевой адаптер Wi-Fi и 72 Мбит (который является скоростью сети сети). Он также имеет адаптер Ethernet-курса 1GBit, мы можем использовать его позже. Все конфигурации являются потребителем, не существует обновления оборудования после покупки в 2013 году. Этот ноутбук будет запустить Node.js для uwebsockets.js v15.1.0.
Сначала нам нужно выполнить некоторые настройки в системе Linux — в основном, изменив файл /etc/security/limits.conf (путь к файлу может отличаться в вашей системе, я использую здесь версию Ubuntu 18.04), чтобы увеличить максимальный open Лимит на количество файлов. Добавьте следующие строки:
* soft nofile 1024000
* hard nofile 1024000
Затем нам нужно установить некоторые другие переменные (опять же, ваш путь может быть другим):
sudo sysctl net.ipv4.tcp_tw_reuse=1
sudo sysctl fs.file-max=1024000
Затем нужно настроить около 50 IP-адресов в пределах определенного сегмента сети. Для моего адаптера Wi-Fi я добавил эту строку конфигурации:
for i in {135..185}; do sudo ip addr add 192.168.0.$i/24 dev wlp3s0; done
Теоретически существует ограничение в 65 тыс. подключений на IP-адрес, но на практике ограничение часто составляет около 20 тыс., поэтому мы используем несколько адресов и делаем так, чтобы каждый адрес поддерживал 20 тыс. подключений (50 * 20 тыс. = 1 миллион).
Затем я использую командуsudo -iЗапустите веб-службу как root, после этого выполнитеulimit -n 1024000команда, за которой следуетnode examples/WebSocket.js(в папке uWebSockets.js) сделайте то же самое.
Это действительно так. Аналогичная настройка выполняется на стороне клиента, но, очевидно, нет необходимости устанавливать несколько IP-адресов. На клиентском компьютере работаетuSocketsНаписан однопоточный C-клиент. Исходный код этого теста является открытым, а клиентский код — «scale_test.c», расположенный в папке uWebSockets/benchmarks. Возможно, вам придется внести небольшие изменения для собственного запуска.
Требуется несколько минут, чтобы количество соединений WebSocket достигло 1 миллиона, если бы мы хотели внести улучшения, мы могли бы увеличить количество соединений на пакет и клиентов, использующих несколько потоков (и так далее), но это не то же самое, что мы интересует на стороне сервера пункт неактуален. Сервер работает в одном потоке и имеет низкую загрузку ЦП во время и после фазы подключения.
Во-первых, давайте поговорим о 5 тысячах закрытых соединений. uWebSockets.js настроен на удаление и уничтожение всех подключений WebSocket, которые простаивали более 60 секунд. Используется «idleTimeout», что означает, что нам нужно активно отправлять и получать сообщения WebSocket каждые 60 секунд при каждом 1 миллионе подключений WebSocket.
Вы можете увидеть всплески трафика, связанные с сообщениями ping, на сетевом графике выше. По крайней мере, 16,7 тыс. сообщений WebSocket в секунду должны достигать сервера, и мы начинаем закрывать соединение после того, как оно полностью отключено.
Очевидно, мы не очень хорошо выполнили этот критерий в сети Wi-Fi. Мы потеряли несколько подключений, но здорово иметь 995 тыс. подключений WebSocket в сети Wi-Fi без причудливой конфигурации!
Использование ЦП на стороне сервера сохраняется в диапазоне 0–2%, использование памяти в пользовательском пространстве составляет около 500 МБ, а общее использование памяти в масштабе всей системы составляет около 4,7 ГБ. На стороне сервера никогда не было всплесков использования ЦП или памяти, оно всегда было в полностью устойчивом состоянии.
В порядке! Итак, давайте избавимся от главного убийцы — Ethernet. Мы подключаем сервер и клиент к 1-гигабитному маршрутизатору потребительского класса и повторно запускаем тест:
В результате служба исправна, потери соединения нет, сеть Wi-Fi нестабильна, но с Ethernet все в порядке. Чтобы убедиться, что все стабильно, я дал клиенту и серверу работать непрерывно в течение часа, чтобы ни одно соединение не было потеряно, а затем около 120 миллионов сообщений WebSocket (16,7k * 60 * 60 * 2):
Каждый стабилен и работает хорошо. На самом деле, я пишу это на своем ноутбуке, на котором работает служба, и количество закрываемых соединений сокетов всегда равно 0, и система отвечает. Служба поддерживает соединение, даже когда я запускаю простую игру.
На данный момент мы уже реализовали очень крутую сцену проверки концепции. Частично это связано со стабильным Ethernet-соединением, но, безусловно, зависит от серверного программного обеспечения. Любые другие программные стеки node.js не могут достичь такого сильного повышения — они не обладают такими легкими и высокими характеристиками производительности, чтобы поддерживать такое количество подключений WebSocket на ноутбуке. Вы можете остановить обмен разделами SWAP, когда система перестанет отвечать на запросы, и следующее перестанет получать результат ping:
Использование UWEBSOCKETS.js, мы можем бежать сотни тысяч сетевых соединений Websocket на этом ноутбуке, но более 1 миллиона регулярных подключений потребуется перекомпиляция ядра Linux с разными пределами, поэтому мы используем его как граничное значение.
Мы не собираемся вдаваться в разработку низкоуровневого встроенного C, и я думаю, что это мудрый выбор. Просто запустите новый экземпляр приложения, новый ноутбук и продолжайте расширять свою проблему таким образом.
Если вы заинтересованы в этом программном стеке, у вас есть проблемы с масштабируемостью ввода-вывода или вы хотите избежать одной из многих распространенных ошибок, обязательно свяжитесь с нами, и мы сможем обсудить проблемы на уровне компаний.
Спасибо за чтение!
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.