Pull to refresh

Comments 18

> net.ipv4.tcp_tw_recycle = 1

Я бы за таое выписал леща. Почитайте почему с 4.12 этого параметра нет в ядре.
Я бы за таое выписал леща.

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

Это хорошие новости. Потому что мы его в своих проектах выключаем. Нет, reuse не требует какого-то специального механизма работы с сокетами.
Я посмотрел статью, там нет никакого внятного объяснения, зачем включают tcp_tw_recycle, просто включили и все. Кроме того, его просто таки нет в новых ядрах уже два года.

По-моему, диагностику лучше всего начинать с просмотра статистики через nstat -az. В кейсе 1 сразу можно было бы увидеть инкрементирование счётчика TcpExtIPReversePathFilter (количество отброшенных rp_filter-ом пакетов), а в кейсе 2 — TcpExtTCPTimeWaitOverflow. Третий кейс интересный, и я когда-то тоже натыкался на это ограничение по-умолчанию на сервере, который работал с кучей мультикаст групп.

Словить третий кейс проще некуда, vpn концентратор с ospf на каждом туннеле, суммарно 60 клиентов, перезапуск ospfd, и чудеса с соседями гарантированы.

Хуже всего, что никаких метрик на этот случай не предусмотрели. Отловить источник проблемы можно лишь догадавшись, почему такое странное ограничение (20), или через запуск strace на процессе, который лишь покажет, что setsockopt с опцией IP_ADD_MEMBERSHIP по какой-то причине возвращает ошибку ENOBUFS.

UFO landed and left these words here
Не совсем так. В sysctl.conf нужно прописать для всех устройств, в том числе для тех, которые не существуют во время загрузки (например, различные VPN). А скрипт позволяет сделать динамически эту штуку.
UFO landed and left these words here
А это для всех вновь созданных и для всех во время загрузки. А на ходу у текущих интерфейсов не сменит.
UFO landed and left these words here

Есть одна особенность, которая не позволяет отключить данным образом 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-режим).

UFO landed and left these words here

Используется именно 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. Параметр означает количество мультикаст групп к которым может подключится хост.
Only those users with full accounts are able to leave comments. Log in, please.

Information

Founded
Location
Россия
Website
flant.ru
Employees
101–200 employees
Registered
Representative
Дмитрий Шурупов