Tcp_tw_reuse vs tcp_tw_recycle: что использовать (или оба)?
У меня есть веб-сайт и приложение, которые используют значительное количество подключений. Обычно он имеет около 3000 соединений, статически открытых и может получать от 5000 до 50000 попыток подключения в течение нескольких секунд.
У меня возникла проблема с запуском локальных портов для открытия новых подключений из-за сокетов статуса TIME_WAIT. Даже с tcp_fin_timeout, установленным на низкое значение (1-5), это, по-видимому, вызывало слишком много накладных расходов/замедлений, и это все равно иногда не могло бы открыть новый сокет.
Я просмотрел tcp_tw_reuse и tcp_tw_recycle, но я не уверен, какой из них был бы предпочтительным выбором, или если использовать оба из них - это вариант.
Ответы
Ответ 1
Согласно документации Linux, вы должны использовать флаг TCP_TW_REUSE, чтобы разрешить повторное использование сокетов в состоянии TIME_WAIT для новых подключений.
Кажется, это хороший вариант при работе с веб-сервером, которому приходится обрабатывать множество коротких TCP-соединений, оставшихся в состоянии TIME_WAIT.
Как описано здесь, TCP_TW_RECYCLE может вызвать некоторые проблемы при использовании балансировщика нагрузки...
EDIT (добавить некоторые предупреждения;)):
как указано в комментарии от @raittes, "проблемы при использовании балансировщика нагрузки" относятся к публичным серверам. Когда включен режим рециркуляции, сервер не может отличать новые входящие соединения от разных клиентов за одним и тем же устройством NAT.
Ответ 2
ПРИМЕЧАНИЕ: net.ipv4.tcp_tw_recycle
был удален из Linux4.12.
ИСТОЧНИК: https://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux