XDP
Тип | Фільтрація пакетів |
---|---|
Автор | Brenden Blanco, Tom Herbert |
Перший випуск | 2016 |
Операційна система | Linux |
Мова програмування | C |
Ліцензія | GPL |
XDP (eXpress Data Path), англ. Швидкий шлях даних — це високопродуктивний метод обробки даних, доданий в ядрі Linux версії 4.8[1], що базується на технології eBPF. Головна ідея методу XDP — дати можливість користувачу виконати власну eBPF-програму на ранньому етапі приймання (англ. RX path) пакету даних. Програма виконується в драйвері мережевої карти одразу після отримання переривання процесором та перед виділенням процесорним ядром додаткових буферів пам'яті (для економії ресурсів та часу), що використовуються мережевим стеком.
Завдяки цим рішенням, XDP дозволяє обробляти до 26 мільйонів пакетів на секунду одним фізичним ядром ЦП на загальнодоступному апаратному забезпеченні.[2] Оскільки eBPF-програми виконуються в просторі ядра[en] операційної системи, з міркувань безпеки вони проходять автоматичну верифікацію[3] програмним забезпеченням ядра, яке виконує статичний аналіз eBPF коду, а саме: доступ поза виділеним адресним простором, циклічне виконання, глобальні змінні. У випадку невідповідності одному з параметрів безпеки — завантаження eBPF-програми в ядро не дозволяється.
eBPF-програмі дозволено модифікувати пакет даних, код її завершення[en] визначає подальші дії над пакетом даних, що будуть виконані мережевим стеком:
XDP_PASS
: дозволити проходження пакету в мережевий стекXDP_DROP
: припинити обробку пакету (скинути пакет)XDP_ABORTED
: припинити обробку пакету з винятком (англ. trace point exception)XDP_TX
: переслати пакет через мережний інтерфейс, з якого він був отриманийXDP_REDIRECT
: переслати пакет до іншого мережного інтерфейсу або сокету AF_XDP
XDP має три можливі режими роботи[4]:
- прямого виконання (англ. Native) — мережевий драйвер виконує eBPF програму безпосередньо;
- вивантаження (англ. Offloaded) — eBPF-програма вивантажується до мережевої карти, де виконується для кожного отриманого пакету. Є найбільш продуктивним режимом, оскільки зменшує навантаження на процесор. Підтримується, зокрема, мережевими картами Netronome[en][5], позаяк Intel та Mellanox Technologies[en][6] працюють над реалізацію його у своїх продуктах;
- загальний (англ. Generic) — оскільки не всі мережні драйвери підтримують режим прямого виконання, також реалізовано режим з точкою виконання в мережному стеці.[7] Є найповільнішим режимом роботи XDP, який було створено для можливості написання та відлагодження XDP програм на системах з мережевими картами без підтримки перших двох режимів роботи.
Разом з XDP у версії ядра 4.18 було представлено нове сімейство сокетів, AF_XDP,[8] (формальна назва — AF_PACKETv4, не була включена в основну гілку ядра),[9] які по суті є оптимізованим для високошвидкісної роботи сирим сокетом (англ. raw socket); швидкодія при цьому досягається за рахунок відсутності копіювання пакету між ядром і застосунком користувача.
Сокет може використовуватись для отримання та надсилання пакетів, що забезпечує роботу високошвидкісних мережевих програм з простору користувача.[10]
Окрім безпосередньої підтримки функціоналу ядром системи, XDP може підтримуватись на рівні драйвера мережевої карти. Оскільки основний приріст швидкості XDP програма отримує завдяки якомога більш ранньому виконанню в мережевому стеку, підтримка на рівні драйвера мережевої карти є необхідною умовою для досягнення високої швидкодії. Відповідно, мережеві карти вищого сегменту підтримують XDP на рівні драйвера.[11]
Функціонал / Драйвер | Версія ядра |
---|---|
Базова архітектура XDP | 4.8 |
Команда: скидання пакету (drop) | |
Команда: пропускання в стек (pass) | |
Команда: пересилка з вхідного порта | |
Пряма модифікація мережевого пакету | |
Драйвер: Mellanox mlx4 | |
Драйвер: Mellanox mlx5 | 4.9 |
Драйвер: Netronome nfp | 4.10 |
Драйвер: QLogic (Cavium) qed* | |
Драйвер: virtio_net | |
Драйвер: Broadcom bnxt_en | 4.11 |
Драйвер: Intel ixgbe* | 4.12 |
Драйвер: Cavium thunderx | |
Загальний режим виконання (Generic XDP) | |
Драйвер: Intel i40e | 4.13 |
Команда: пересилка пакету до іншого
мережевого інтерфейсу |
4.14 |
Підтримка tap-інтерфейсів | |
Підтримка veth-інтерфейси | |
Драйвер: Intel ixgbevf | 4.17 |
Драйвер: Freescale dpaa2 | 5.0 |
Драйвер: Socionext netsec | 5.3 |
Драйвер: TI cpsw | |
Драйвер: Intel ice | 5.5 |
Драйвер: Solarflare sfc | |
Драйвер: Marvell mvneta | |
Драйвер: Microsoft hv_netvsc | 5.6 |
Драйвер: Amazon ena | |
Драйвер: xen-netfront | 5.9 |
Драйвер: Intel igb | 5.10 |
- ↑ [GIT] Networking - David Miller. lore.kernel.org. Архів оригіналу за 14 травня 2019. Процитовано 14 травня 2019.
- ↑ Høiland-Jørgensen, Toke (3 травня 2019), Source text and experimental data for our paper describing XDP: tohojo/xdp-paper, процитовано 21 травня 2019
- ↑ A thorough introduction to eBPF [LWN.net]. lwn.net. Архів оригіналу за 18 вересня 2020. Процитовано 14 травня 2019.
- ↑ BPF and XDP Reference Guide — Cilium 1.8.90 documentation. docs.cilium.io. Архів оригіналу за 18 вересня 2020. Процитовано 27 вересня 2020.
- ↑ BPF, eBPF, XDP and Bpfilter… What are these things and what do they mean for the enterprise? - Netronome. www.netronome.com (англ.). Архів оригіналу за 24 вересня 2020. Процитовано 14 травня 2019.
- ↑ XDP acceleration using NIC metadata (PDF). Архів оригіналу (PDF) за 25 серпня 2020. Процитовано 26 вересня 2020.
- ↑ net: Generic XDP. www.mail-archive.com. Архів оригіналу за 14 травня 2019. Процитовано 14 травня 2019.
- ↑ kernel/git/torvalds/linux.git - Linux kernel source tree. git.kernel.org. Процитовано 16 травня 2019.
- ↑ Questions about AF_PACKET V4 and AF_XDP. Kernel.org. Архів оригіналу за 6 вересня 2019.
- ↑ Accelerating networking with AF_XDP [LWN.net]. lwn.net. Архів оригіналу за 18 вересня 2020. Процитовано 16 травня 2019.
- ↑ Список драйверів мережевих карт, що підтримують XDP (Англійська) . 23 серпня 2020. Архів оригіналу за 25 жовтня 2020.
- Уроки використання XDP API [Архівовано 18 вересня 2020 у Wayback Machine.] - репозиторій на GitHub.
- Документація - XDP [Архівовано 24 лютого 2021 у Wayback Machine.] - Read the Docs
- Документація - AF_XDP [Архівовано 2 жовтня 2020 у Wayback Machine.] - kernel.org
- XDP walkthrough [Архівовано 8 березня 2021 у Wayback Machine.] - конференція FOSDEM 2017, презентація Daniel Borkmann, Cilium
- AF_XDP [Архівовано 19 червня 2021 у Wayback Machine.] - конференція FOSDEM 2018, презентація Magnus Karlsson, Intel
- eBPF.io - Introduction, Tutorials & Community Resources [Архівовано 25 червня 2021 у Wayback Machine.]
- L4Drop: XDP DDoS Mitigations [Архівовано 25 серпня 2020 у Wayback Machine.], Cloudflare
- Unimog: Cloudflare's edge load balancer [Архівовано 30 червня 2021 у Wayback Machine.], Cloudflare
- Open-sourcing Katran, a scalable network load balancer [Архівовано 14 червня 2019 у Wayback Machine.], Facebook
- Cilium's L4LB: standalone XDP load balancer [Архівовано 23 червня 2021 у Wayback Machine.], Cilium [Архівовано 19 червня 2021 у Wayback Machine.]
- Kube-proxy replacement at the XDP layer [Архівовано 14 червня 2021 у Wayback Machine.], Cilium [Архівовано 19 червня 2021 у Wayback Machine.]
- eCHO Podcast on XDP and load balancing [Архівовано 14 червня 2021 у Wayback Machine.]