Лимит подключений HAProxy на сервер в бекенде ограничен диапазоном портов.

Вопрос или проблема

Я запускаю балансировщик нагрузки 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"
  • Используйте больше IP-адресов: Каждый уникальный source_ip может иметь свой собственный набор портов, таким образом добавление новых IP-адресов может значительно увеличить количество возможных соединений.
  • Включите балансировку между несколькими серверами: Как вы уже заметили, добавление дополнительных backend-серверов позволяет распределить нагрузки и увеличить общее количество подключений.

Учет состояния TIME_WAIT

Не забудьте, что TCP-соединения также учитывают состояние TIME_WAIT, что временно удерживает порты после закрытия соединения. Оптимизация этого времени может ускорить повторное использование портов, но будьте осторожны, чтобы не нарушить стабильность приложения.

В заключение, вы сталкиваетесь с фундаментальным аспектом работы TCP. Реализуйте предлагаемые решения для повышения количества активно установленных соединений в рамках текущих сетевых ограничений, используя множество стратегий улучшения производительности.

Оцените материал
Добавить комментарий

Капча загружается...