Вопрос или проблема
Я запускаю балансировщик нагрузки HAProxy для сервера WebSocket.
Если я добавлю один сервер в backend
backend pieproxy
option http-keep-alive
timeout tunnel 0ms
balance leastconn
server s1 IP:3001
HAProxy может обрабатывать только 28,000 установленных соединений.
Я могу обойти это ограничение и установить больше соединений, добавив еще один сервер.
backend pieproxy
option http-keep-alive
timeout tunnel 0ms
balance leastconn
server s1 IP:3001
server s2 IP:3001
Теперь HAProxy может установить вдвое больше соединений.
Когда я уменьшаю значение
sysctl net.ipv4.ip_local_port_range
HAProxy может установить максимальное количество соединений до
число серверов в backend * ip_local_port_range
Пожалуйста, помогите,
Я что-то упускаю?
Как я могу заставить один сервер backend обслуживать больше соединений, чем значение ip_local_port_range
Кратко: ограничение, которое вы видите, связано с тем, как работает TCP.
Каждое TCP-соединение определяется уникальным кортежем (source_ip, source_port, destination_ip, destination_port), что означает, что не может быть нескольких соединений с одинаковым кортежем одновременно, так как их нельзя было бы четко различить. В вашем случае destination_ip и destination_port постоянны, так как у вас есть фиксированный сервер назначения. Source_ip постоянен, так как это IP-адрес вашей локальной системы, где запущен HAProxy.
Так что единственной переменной является source_port, и он берется из ip_local_port_range.
Это означает, что вы не можете иметь больше соединений параллельно, чем значение ip_local_port_range, с тем же destination ip:port от того же source ip. А ip_local_port_range ограничен тем, что номер порта – это всего 16 бит (т.е. максимум 65535).
Заметьте, что “параллельно” – это не только о соединениях, происходящих одновременно, так как может пройти некоторое время, прежде чем тот же source_ip может быть использован снова – подробнее читайте о состоянии TIME_WAIT в TCP.
Ответ или решение
Вы хотите узнать, почему HAProxy ограничивает количество подключений к одному серверу, и как это изменить. Давайте разберемся в том, как функционирует работа с подключениями в TCP и как это влияет на ваше использование HAProxy.
Технические ограничения TCP
Каждое TCP-соединение идентифицируется уникальной четырехэлементной структурой (source_ip, source_port, destination_ip, destination_port). Это означает, что невозможно установить одинаковые соединения с одной и той же конечной точкой, поскольку они должны быть уникально идентифицированы для корректного маршрутизации данных. В вашем случае, destination_ip и destination_port уже установлены для одного сервера, а source_ip является IP-адресом вашей системы, на которой работает HAProxy.
Ограничения ip_local_port_range
Другой переменной в этой структуре является source_port, который выбирается из диапазона ip_local_port_range. Именно он ограничивает максимальное количество одновременных соединений, которые вы можете установить с одного IP-адреса на один и тот же сервер. Диапазон ip_local_port_range по умолчанию может быть от 32768 до 60999, что предоставляет до 28231 одновременно открытых портов.
Как обойти это ограничение
- Увеличьте диапазон портов: Попробуйте расширить ip_local_port_range. Это можно сделать с помощью команды:
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
Учет состояния TIME_WAIT
Не забудьте, что TCP-соединения также учитывают состояние TIME_WAIT, что временно удерживает порты после закрытия соединения. Оптимизация этого времени может ускорить повторное использование портов, но будьте осторожны, чтобы не нарушить стабильность приложения.
В заключение, вы сталкиваетесь с фундаментальным аспектом работы TCP. Реализуйте предлагаемые решения для повышения количества активно установленных соединений в рамках текущих сетевых ограничений, используя множество стратегий улучшения производительности.