Комментарии 18
Я бы за таое выписал леща. Почитайте почему с 4.12 этого параметра нет в ядре.
Для начала у меня для вас плохие новости:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4396e46187ca5070219b81773c4e65088dac50cc
А во-вторых, на сколько я помню tcp_tw_reuse требует поддержки в ПО: нужно использовать другую функцию открытия соединения.
По поводу tcp_tw_recycle
, думаю стоит обратить внимание на вот эту статью https://habr.com/ru/company/flant/blog/332432/
и возможно поправить приведенные в статье параметры sysctl
в самом конце.
По-моему, диагностику лучше всего начинать с просмотра статистики через nstat -az
. В кейсе 1 сразу можно было бы увидеть инкрементирование счётчика TcpExtIPReversePathFilter
(количество отброшенных rp_filter-ом пакетов), а в кейсе 2 — TcpExtTCPTimeWaitOverflow
. Третий кейс интересный, и я когда-то тоже натыкался на это ограничение по-умолчанию на сервере, который работал с кучей мультикаст групп.
Словить третий кейс проще некуда, vpn концентратор с ospf на каждом туннеле, суммарно 60 клиентов, перезапуск ospfd, и чудеса с соседями гарантированы.
Хуже всего, что никаких метрик на этот случай не предусмотрели. Отловить источник проблемы можно лишь догадавшись, почему такое странное ограничение (20), или через запуск strace
на процессе, который лишь покажет, что setsockopt
с опцией IP_ADD_MEMBERSHIP
по какой-то причине возвращает ошибку ENOBUFS
.
Есть одна особенность, которая не позволяет отключить данным образом rp_filter. Дело в том, что применяется значение max(all, <iface>)
, т.е. если у вас в конфиге интерфейса net.ipv4.conf.${iface}.rp_filter = 1
, а net.ipv4.conf.all.rp_filter = 0
, то для интерфейса будет использоваться значение rp_filter = 1
. Правильнее не отключать rp_filter
совсем, а использовать так называемый loose-режим, который смягчает правила rp_filter
, и будет отбрасывать пакеты лишь в том случае, если до источника этих пакетов вообще нет маршрута. Если же маршрут до источника есть, но он не совпадает с интерфейсом, на который пришли пакеты, то они всё равно будут пропущены, а не отброшены, как при rp_filter = 1
(strict-режим).
Используется именно MAX, а не AND. При проверке используется макрос IN_DEV_RPFILTER, который в свою очередь использует макрос IN_DEV_MAXCONF, который уже использует макрос max. У переменных sysctl подобная логика может различаться. Для уточнения лучше читать либо документацию, либо исходники.
1. В любом учебнике.
2. В общем-то тоже. И в RFC нет рекомендаций 2-х минут. Там по умолчанию часов 8 было, а 2 минуты для MSL просто как пример приводили.
3.
Снова углубились в чтение документации, где и был обнаружен параметр ядра igmp_max_memberships, который ограничивает количество multicast-соединений для одного сокета
К сокету он отношения не имеет, даже если вы видите socket error 105. Параметр означает количество мультикаст групп к которым может подключится хост.
3 необычных кейса о сетевой подсистеме Linux