Рейтинг:1

Циклическое использование нескольких IP-адресов для исходящих соединений на одном интерфейсе

флаг us

моя проблема: У меня есть процесс, создающий более 10 тыс. TCP-подключений к одному и тому же IP-адресу и порту назначения в секунду. Через короткий промежуток времени новые подключения больше не могут быть созданы, так как больше нет доступных исходных портов.

Я уже пытался смягчить это, установив net.ipv4.ip_local_port_range и net.ipv4.tcp_fin_timeout но это не решило проблему.

Теперь моя мысль заключалась в следующем: если бы я мог указать ядру циклически перебирать исходные IP-адреса, то я мог бы легко добавить больше IP-адресов к моему одному интерфейсу и, следовательно, иметь более высокий лимит исходящих соединений.

Я попытался добавить несколько маршрутов к одному и тому же месту назначения через один и тот же интерфейс, но указать разные исходные IP-адреса:

ip route добавить по умолчанию через 10.1.1.1 dev eth0 src 10.1.1.10
ip route добавить по умолчанию через 10.1.1.1 dev eth0 src 10.1.1.11

Но я получаю RTNETLINK отвечает: файл существует.

Я на правильном пути здесь? Является ли в таких случаях добавление другого исходного IP-адреса «правильным решением»?

Есть ли способ циклического перебора/балансировки нагрузки при использовании исходных IP-адресов через ядро?

Я надеялся, что если мне удастся поместить два маршрута с одинаковым весом, но разными src-адресами в одну и ту же сеть, ядро ​​будет выполнять циклический перебор.

(Предыстория: я запускаю HAproxy на этой машине, и мне приходится балансировать нагрузку более чем 10 000 подключений к одному внутреннему серверу)

Рейтинг:3
флаг iq

Не легко через ядро, нет.

Я запускаю HAproxy на этой машине, и мне приходится балансировать нагрузку более 10 000 подключений к одному внутреннему серверу.

Вы можете указать haproxy использовать определенный исходный IP-адрес для исходящих подключений к серверу, например:

  сервер app1_s1 10.0.1.1:80 источник 10.1.1.10
  сервер app1_s2 10.0.1.1:80 источник 10.1.1.11
  сервер app2_s1 10.0.1.2:80 источник 10.1.1.10
  сервер app2_s2 10.0.1.2:80 источник 10.1.1.11
флаг us
Это, по крайней мере, предотвратило бы мою проблему, так что спасибо за это :) Я надеялся, что ядро ​​справится с этим, но если это невозможно, то я соглашусь с этим. Когда вы сказали «Не легко через ядро, нет», это означает, что нет простого пути, или это означает, что на самом деле нет никакого способа? Мне не очень нравится тот факт, что тогда мне придется определять каждый внутренний сервер дважды, но я обращусь к HAProxy и размещу запрос функции, чтобы добавить более одного исходного IP-адреса в одну строку сервера / в один блок конфигурации внутреннего сервера.
флаг iq
это то, чего мне не хватает, и это доступно в других продуктах — возможность указать несколько адресов или диапазон адресов для использования здесь вместо одного.
Рейтинг:2
флаг za

Вы все еще не знаете. net.ipv4.ip_local_port_range должно хватить даже с настройками по умолчанию. Так что могу поспорить, что либо у вас больше 10 000 подключений, либо вы неправильно диагностируете.

Смотрите, "ipsrc:порт ipdst:порт" Quaduplet уникален для всего IP-стека машины, а поскольку общее количество портов в сетевом стеке равно 65 536, теоретически это дает вам возможность иметь 65 536 подключений. Хорошо, мы минусуем блок WKS (-1024), но это все равно дает вам 55536 подключений с фальсифицированным net.ipv4.ip_local_port_range. Вам нужно использовать дополнительные IP-адреса/интерфейсы, только если вам нужно больше.

И обычно эта проблема решается добавлением большего количества клиентских IP-адресов. и/или IP-адреса сервера, если пункт назначения также находится внутри вашего стека, или с использованием нескольких таблиц маршрутизации, если это не так.

флаг us
У меня 10 тысяч новых подключений в секунду, и они довольно недолговечны. Но: Как только соединения закрываются (насколько я понимаю), они переходят в состояние TIME_WAIT. Таким образом, они не могут быть использованы в течение 60 секунд. И именно поэтому я также исчерпал измененный `net.ipv4.ip_local_port_range` :/ Сервер на самом деле не находится в моем стеке, поэтому я не могу делать там настройки. Вот почему я хотел использовать несколько адресов IPv4 на одном интерфейсе и позволить ядру балансировать нагрузку между этими адресами.
drookie avatar
флаг za
Общее количество связей имеет значение, а не только УСТАНОВЛЕННЫЕ. Соединение является соединением независимо от его состояния.
флаг us
Да, я знаю об этом. И поскольку количество подключений превышает доступные порты, даже после настройки `net.ipv4.ip_local_port_range` я ищу способ идеального баланса ядра между несколькими исходными IP-адресами на одном интерфейсе. (Поскольку я не могу ничего редактировать на стороне сервера) Только если ядро ​​не может этого сделать, я бы выбрал другой вариант, когда HAProxy сам обрабатывает несколько исходных IP-адресов.

Ответить или комментировать

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