peredozo
@peredozo

Почему тормозит NGINX + NodeJS WebSocket + MySQL при 2000+ подключениях?

Есть такая структура:
1. Сервер главного приложения TCP.
2. Сервер с базой MySQL.
3. Несколько серверов где NGINX принимает SSL соединения, проксирует их через unix domain socket на NodeJS WebSocket, который внутри работает с удаленной базой MySQL через одно соединение для всех пользователей + для каждого пользователя создает TCP канал к главному серверу. Т.е. каждое подключение создает еще одно исходящее подключение к другому серверу, фактически TCP соединений получается примерно в 2 раза больше чем пользователей.

Все работает нормально. Как только к одному из WS серверов подключается больше 2000 пользователей он начинает дико тормозить. Например, при 1900 пользователей подключение и обмен данными идет меньше секунды, а при 2100 пользователей подключение и обмен данными идет около минуты. При этом никаких ошибок нигде нет. Все работает, просто резко падает скорость в 100 раз.

Другие сервера при этом работают нормально. Тормозить начинают только те куда подключилось больше 2000 пользователей.

Везде стоит Ubuntu Server 16.04 в стандартной конфигурации + убраны/завышены все лимиты о которых знаю.
Нагрузка на процессор минимальная, свободной оперативки везде много, трафик вроде тоже потребляет в целом не больше 1Mbit при канале 1Gbit.

Что это может быть, куда смотреть? Может есть какая-нибудь программа посмотреть выходит ли какой-то процесс за какие-то лимиты?
  • Вопрос задан
  • 677 просмотров
Пригласить эксперта
Ответы на вопрос 3
  • @Wexter
    смотрите загрузку дисков
    iostat -x -m 1

    смотрите загрузку процессора/потребление памяти в htop
    смотрите как устроен сам сервер ws, возможно его архитектура недостаточно хороша для одновременной работы большого числа клиентов и требуется пересмотреть её.
    если нагрузка по памяти/процессору достаточно низкая то есть смысл поднять несколько процессов ws на одном сервере и проксировать ко всем через nginx
    Ответ написан
  • vitaliy2
    @vitaliy2
    1. Не сказана, какая нагрузка на сервер. Может быть, в этот момент процессор или диск загружен на 100% — поэтому и тормозит.
    2. Если Вы уже прошлись по всем узким горлышкам, и видите, что нигде загрузки нет, вероятно, у Вас просто неправильные настройки. Например, в nginx по умолчанию стоит очень маленькое количество соединений, и как только к Вам подключится такое количество пользователей, всё начнёт виснуть. Например, если worker_processes стоит 2, а worker_connections — 1000, то nginx сможет одновременно обслуживать не больше 2000 запросов, остальные запросы будут ставиться в очередь. Решение — поставить их на максимум (сколько не жалко оперативки). Соединение отъедает где-то 10 КБ памяти, поэтому если Вы поставите 100 тыс соединений, то nginx сможет отожрать до 1 ГБ памяти.
    Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы