XDP (eXpress Data Path), — це високопродуктивний метод обробки даних, доданий в ядрі Linux версії 4.8, що базується на технології eBPF. Головна ідея методу XDP — дати можливість користувачу виконати власну eBPF-програму на ранньому етапі приймання () пакету даних. Програма виконується в драйвері мережевої карти одразу після отримання переривання процесором та перед виділенням процесорним ядром додаткових буферів пам'яті (для економії ресурсів та часу), що використовуються мережевим стеком.
Завдяки цим рішенням, XDP дозволяє обробляти до 26 мільйонів пакетів на секунду одним фізичним ядром ЦП на загальнодоступному апаратному забезпеченні. Оскільки eBPF-програми виконуються в операційної системи, з міркувань безпеки вони проходять автоматичну верифікацію програмним забезпеченням ядра, яке виконує статичний аналіз eBPF коду, а саме: доступ поза виділеним адресним простором, циклічне виконання, глобальні змінні. У випадку невідповідності одному з параметрів безпеки — завантаження eBPF-програми в ядро не дозволяється. __TOC__ eBPF-програмі дозволено модифікувати пакет даних, код її завершення визначає подальші дії над пакетом даних, що будуть виконані мережевим стеком: XDP_PASS: дозволити проходження пакету в мережевий стек XDP_DROP: припинити обробку пакету (скинути пакет) XDP_ABORTED: припинити обробку пакету з винятком () XDP_TX: переслати пакет через мережний інтерфейс, з якого він був отриманий XDP_REDIRECT: переслати пакет до іншого мережного інтерфейсу або сокету AF_XDP XDP має три можливі режими роботи: прямого виконання () — мережевий драйвер виконує eBPF програму безпосередньо; вивантаження () — eBPF-програма вивантажується до мережевої карти, де виконується для кожного отриманого пакету. Є найбільш продуктивним режимом, оскільки зменшує навантаження на процесор. Підтримується, зокрема, мережевими картами Netronome , позаяк Intel та працюють над реалізацію його у своїх продуктах; загальний () — оскільки не всі мережні драйвери підтримують режим прямого виконання, також реалізовано режим з точкою виконання в мережному стеці. Є найповільнішим режимом роботи XDP, який було створено для можливості написання та відлагодження XDP програм на системах з мережевими картами без підтримки перших двох режимів роботи.
AF_XDP
Разом з XDP у версії ядра 4.18 було представлено нове сімейство сокетів, AF_XDP, (формальна назва — AF_PACKETv4, не була включена в основну гілку ядра), які по суті є оптимізованим для високошвидкісної роботи сирим сокетом (); швидкодія при цьому досягається за рахунок відсутності копіювання пакету між ядром і застосунком користувача.
Сокет може використовуватись для отримання та надсилання пакетів, що забезпечує роботу високошвидкісних мережевих програм з простору користувача.
Підтримка XDP різними версіями Linux ядра Окрім безпосередньої підтримки функціоналу ядром системи, XDP може підтримуватись на рівні драйвера мережевої карти. Оскільки основний приріст швидкості XDP програма отримує завдяки якомога більш ранньому виконанню в мережевому стеку, підтримка на рівні драйвера мережевої карти є необхідною умовою для досягнення високої швидкодії. Відповідно, мережеві карти вищого сегмента підтримують XDP на рівні драйвера.
Функціонал / ДрайверВерсія ядраБазова архітектура XDP4.8Команда: скидання пакету (drop)Команда: пропускання в стек (pass)Команда: пересилка з вхідного портаПряма модифікація мережевого пакетуДрайвер: Mellanox mlx4Драйвер: Mellanox mlx54.9Драйвер: Netronome nfp4.10Драйвер: QLogic (Cavium) qed*Драйвер: virtio_net Драйвер: Broadcom bnxt_en 4.11Драйвер: Intel ixgbe* 4.12Драйвер: Cavium thunderx Загальний режим виконання (Generic XDP)Драйвер: Intel i40e4.13Команда: пересилка пакету до іншого мережевого інтерфейсу4.14Підтримка tap-інтерфейсівПідтримка veth-інтерфейсиДрайвер: Intel ixgbevf4.17Драйвер: Freescale dpaa25.0Драйвер: Socionext netsec5.3Драйвер: TI cpswДрайвер: Intel ice5.5Драйвер: Solarflare sfcДрайвер: Marvell mvnetaДрайвер: Microsoft hv_netvsc5.6Драйвер: Amazon enaДрайвер: xen-netfront5.9Драйвер: Intel igb5.10Драйвер: Freescale dpaa 5.11Драйвер: Intel igc 5.13Драйвер: Freescale enetc Драйвер: STMicro stmmac підтримка bonding девайсів 5.15Драйвер: Marvell otx25.16Драйвер: Microsoft mana 5.17Драйвер: Fungible fun 5.18Драйвер: Aquantia atlantic 5.19Драйвер: Mediatek mtk 6.0Драйвер: Freescale fec_enet 6.2Драйвер: Microchip lan966x Драйвер: Engleder tsnep 6.3Драйвер: Google gve 6.4Драйвер: VMware vmxnet3 6.6
Примітки
Зовнішні посилання
Уроки використання XDP API - репозиторій на GitHub. Документація - XDP - Read the Docs Документація - AF_XDP - kernel.org XDP walkthrough - конференція FOSDEM 2017, презентація Daniel Borkmann, Cilium AF_XDP - конференція FOSDEM 2018, презентація Magnus Karlsson, Intel eBPF.io - Introduction, Tutorials & Community Resources L4Drop: XDP DDoS Mitigations , Cloudflare Unimog: Cloudflare's edge load balancer , Cloudflare Open-sourcing Katran, a scalable network load balancer , Facebook Cilium's L4LB: standalone XDP load balancer , Cilium Kube-proxy replacement at the XDP layer , Cilium eCHO Podcast on XDP and load balancing