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

Что это может быть, куда смотреть? Может есть какая-нибудь программа посмотреть выходит ли какой-то процесс за какие-то лимиты?
  • Вопрос задан
  • 807 просмотров
Пригласить эксперта
Ответы на вопрос 3
miraage
@miraage
Lead Software Engineer
Используйте pm2, если он не еще не используется.
Ответ написан
@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
Похожие вопросы
Cindx Москва
от 90 000 до 140 000 руб.
SaveTime Москва
от 140 000 до 200 000 руб.
17 нояб. 2018, в 19:01
20000 руб./за проект
17 нояб. 2018, в 17:59
10000 руб./за проект
17 нояб. 2018, в 17:27
6000 руб./за проект