моя проблема:
У меня есть процесс, создающий более 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 подключений к одному внутреннему серверу)