Итак, у меня есть входящий поток UDP, состоящий из 272 байтовых пакетов со скоростью передачи данных около 5,12 Гбит/с (около 320 е6 пакетов в секунду). Эти данные отправляются пользовательской платой на основе FPGA. Размер пакета - это предел цифрового дизайна, поэтому, хотя теоретически можно было бы увеличить его, чтобы сделать вещи более эффективными, для этого потребуется большая работа. На принимающей стороне эти пакеты считываются и интерпретируются сетевым потоком и помещаются в круглый буфер, совместно используемый потоком буферизации, который копирует эти данные в GPU для обработки.Как справиться с 320 миллионами 272-байтовых пакетов UDP?
Вышеуказанная установка на принимающей стороне может справиться с 5.12 Гбит/с для пакета 4096 КБ (используется в другом дизайне), используя простые вызовы recv
, однако с текущим размером пакета мне нелегко идти в ногу с поток пакетов, слишком много времени «теряется» при переключении контекста и копировании небольших сегментов данных из пространства ядра в пространство пользователя. Я сделал быструю тестовую реализацию, которая использует recvmmsg
, однако многое не улучшилось. В среднем я могу обрабатывать около 40% входящих пакетов.
Так что мне было интересно, можно ли получить дескриптор буфера данных UDP ядра для моего приложения (стиль mmap) или использовать какое-то нулевое копирование из ядра в пользовательское пространство? Альтернативно, знаете ли вы о любом другом методе, который уменьшил бы эти накладные расходы и мог бы выполнять требуемую обработку?
Это работает на Linux-машине (ядро 3.2.0-40) с использованием кода C.
ОК, я подробно рассмотрю 'пакет_mmap' (я только проглядывал его раньше). Я сообщу позже. Спасибо – lessju
'package_mmap', похоже, работает красиво. благодаря – lessju