У меня есть Linux-сервер, работающий как маршрутизатор без iptables или другого брандмауэра и без запущенных на нем сетевых приложений, просто чистый маршрутизатор. Я поместил его в тестовую среду, которая генерирует множество TCP-соединений, каждое из которых имеет уникальный IP-адрес источника и назначения, и эти соединения проходят через этот маршрутизатор. Я наблюдаю, что количество успешно созданных подключений возрастает примерно до 500, а затем в течение нескольких минут больше нельзя создавать подключения, затем можно создавать еще 100 подключений, наступает еще одна пауза и так далее. Если создается 10 подключений для каждой пары источник-назначение, максимальное количество увеличивается примерно в 10 раз, поэтому проблема, вероятно, связана с большим количеством подключений с разных IP-адресов.
Поскольку трафик просто маршрутизируется, он не связан с количеством файловых дескрипторов, отслеживанием соединений iptables и другими вещами, которые часто предлагается проверять в аналогичных случаях. В коробке много свободной оперативной памяти и процессора, обе сетевые карты гигабитные. Ядро 2.6.32.
Я уже пробовал увеличить net.core. * Mem_max, net.core.netdev_max_backlog и txqueuelen на обоих сетевых адаптерах, но без всякого эффекта. Что еще я должен проверить? Есть ли ограничение скорости в самом ядре?
Я нашел ответ, и это было довольно забавно - переполнение таблицы ARP. Трафик в тестовой среде генерировался со многих IP-адресов, которые находились в напрямую подключенных сетях, поэтому системе пришлось сначала использовать ARP для определения MAC-адресов, а жесткое ограничение по умолчанию для таблицы ARP в Linux составляет всего 1024 записи, что дает число соединений между сетями, подключенными к 2 разным интерфейсам, близким к 512. Когда я увеличил net.ipv4.neigh.gc_thresh1, а также .gc_thresh2 и .gc_thresh3, проблема была решена.
Непонятно, почему вы уверены, что проблема не в одной из ваших конечных точек (клиент или сервер), какой тип трафика вы генерируете? Работает ли с другим устройством?