При тестировании сетевого ПО часто сталкиваются с проблемой генерации трафика на скоростях over 9000 выше 100Mbit/s. Одна из самых популярных утилит для этого - tcpreplay, но она обладает некоторыми проблемами технического характера. На конфигурации 4Gb RAM, Core 2 Quad 2.7Ghz, Intel e1000e 1Gbit Ethernet имеет место быть ограничение на ~0.5Gb скорости. Судя по тому, что такое же ограничение получается в самописных утилитах для стресс-тестов,проблема связана с передачей данных из программы в пространство ядра.
Не вдаваясь в подробности, основной затык заключается в системных вызовах send(). Уменьшить их количество позволяет настоящая тру-джедайская магия TX ring
Данный API был доступен в виде патча ядра достаточно давно, но лишь с 2.6.31 ядра его включили в основную ветку ядра Linux.
Я модифицировал tcpreplay, заставив его использовать TX ring для отправки данных. В итоге был преодолён барьер в 500Mbit и почти достигнут 1Gb. Патч брать тут
Важно! TX ring работает с ванильным ядром начиная с версии 2.6.31. Хотя в 2.6.34-1 попытка использовать TX ring оборачивается неадекватными записями в логах ядра и кернел паником (брал сборку из debian experimental), впрочем ядро ещё молоденькое, ему можно. Более младшие версии надо отдельно патчить и компилять самостоятельно. Фанаты Gentoo радуются, все остальные ставят 2.6.32 и не греют моск.