различия между DPDK и Netfilter

Я хочу обойти сетевой стек Linux и преобразовать необработанные пакеты в свои собственные коды в userland и обрабатывать их там.

Я знаю, что вы можете создавать свои собственные драйверы, используя pf-rings или DPDK и другие. Но я не могу понять, почему я должен делать такие драйвера, когда я могу использовать Netfilter и подключить свой модуль к состоянию NF_IP_PRE_ROUTING и отправлять пакеты в состояние userland.

Для меня было бы очень полезно, если бы кто-нибудь мог объяснить мне основные различия между ними.


person Pis7Aller    schedule 18.11.2018    source источник


Ответы (2)


Существует огромная разница между перехватчиками DPDK и Netfilter. При использовании Netfilter / перехвата NF_IP_PRE_ROUTING вы перехватываете поток пакетов и копируете пакеты из пространства ядра в пространство пользователя. Эта копия вызывает большие накладные расходы.

При использовании DPDK вы фактически сопоставляете буферы пакетов вашей сетевой карты с областью памяти пользовательского пространства. Это означает, что вместо того, чтобы ядро ​​получало прерывание от сетевого адаптера, а затем пропускало его через все свои очереди, пока не достигнет NF_IP_PRE_ROUTING, что, в свою очередь, по запросу скопирует упаковщик в пространство пользователя, DPDK предлагает вам возможность доступа к сопоставленным буферам пакетов напрямую из пользовательского пространства, минуя всю метаобработку ядра, эффективно повышая производительность (за счет сложности кода и безопасности).

person Knightingale    schedule 18.11.2018
comment
Вы уверены, что пакеты копируются в пространство пользователя при использовании PF_RING? Документ vPF_RING, подготовленный авторами PF_RING, говорит об обратном (раздел 2.3). - person pchaigno; 19.11.2018

Существует множество методов захвата необработанных пакетов и доставки их в приложение пользовательского пространства. Дьявол как всегда в деталях.

Если все, что нам нужно, это доставлять пакеты пользовательскому приложению, нет никакой разницы, какое решение использовать. Libpcap, или tun/taps, или Netfilter, или pf-ring, или что-то еще. Все будет нормально.

Но если нам нужно обработать 100 миллионов пакетов в секунду (~30 циклов ЦП на пакет на 3 ГГц) — я не думаю, что у нас есть другие варианты на данный момент, кроме DPDK. Погуглите "отчет о производительности DPDK" и посмотрите.

DPDK — это фреймворк, который хорошо работает на многих платформах (x86, ARM, POWER и т. д.) и поддерживает множество сетевых карт. Драйвер писать не нужно, поддержка самых популярных сетевых карт уже есть.

Существует также поддержка управления ядрами ЦП, огромными страницами, буферами памяти, шифрованием, фрагментацией IP и т. д. Все это предназначено для пересылки 100 миллионов пакетов в секунду. Если нам нужна эта производительность...

person Andriy Berestovskyy    schedule 18.11.2018