Почему тормозит 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.

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

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

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

Войти через центр авторизации
Похожие вопросы