XDP
Тип | Фільтрація пакетів |
---|---|
Автор | Brenden Blanco, Tom Herbert |
Перший випуск | 2016 |
Операційна система | Linux |
Мова програмування | C |
Ліцензія | GPL |
XDP (eXpress Data Path), англ. Швидкий шлях даних — це високопродуктивний метод обробки даних, доданий в ядрі Linux версії 4.8[1], що базується на технології eBPF. Головна ідея методу XDP — дати можливість користувачу виконати власну eBPF-програму на ранньому етапі приймання (англ. RX path) пакету даних. Програма виконується в драйвері мережевої карти одразу після отримання переривання процесором та перед виділенням процесорним ядром додаткових буферів пам'яті (для економії ресурсів та часу), що використовуються мережевим стеком[en].
Завдяки цим рішенням, 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.]