XDP eBPF 与 TC eBPF

概述

参考:

eXpress Data Path(特快数据路径,简称 XDP) 是从 4.8 版开始在 Linux 内核中合并的基于 eBPF 的高性能数据路径。

XDP 背后的想法是在内核的 RX 路径中添加一个早期钩子,然后让用户提供的 eBPF 程序来决定数据包的命运。该挂钩刚好在中断处理之后,在网络堆栈本身需要的任何内存分配之前放置在 NIC 驱动程序中,因为内存分配可能是一项昂贵的操作。由于这种设计,使用商用硬件,XDP 可以每秒每核心丢弃 2 千 6 百万个数据包。

eBPF 程序在加载之前必须通过预验证器测试,以避免在内核空间中执行恶意代码。预验证器检查程序是否不包含越界访问,循环或全局变量。

Linux 内核中的数据包流路径。XDP 绕过了网络堆栈和数据包元数据的内存分配。

允许程序编辑数据包数据,并且在 eBPF 程序返回后,操作代码确定如何处理数据包:

  • XDP_PASS:让数据包继续通过网络堆栈
  • XDP_DROP:静默丢弃数据包
  • XDP_ABORTED:丢弃具有跟踪点异常的数据包
  • XDP_TX:将数据包弹回到达的同一网卡
  • XDP_REDIRECT:通过 AF_XDP 地址族将数据包重定向到另一个 NIC 或用户空间套接字

XDP 需要 NIC 驱动程序的支持,但由于并非所有驱动程序都支持 XDP,因此它可以回退到通用实现,该通用实现在网络堆栈中执行 eBPF 处理,但性能较慢。

XDP 具有将 eBPF 程序卸载到支持它的 NIC 卡的基础结构,从而减少了 CPU 负载。当时只有 Netronome 卡支持它,[5]由 Intel 和 Mellanox 共同开发。

AF_XDP

与 XDP 一起,从 4.18 开始在 Linux 内核中输入了一个新的地址族。AF_XDP,以前称为 AF_PACKETv4(从未包含在主线内核中),是针对高性能数据包处理进行了优化的原始套接字,并允许内核与应用程序之间的零复制。由于套接字可用于接收和发送,因此它仅在用户空间中支持高性能网络应用程序。


最后修改 March 18, 2024: nic, dpdk, kernel, dpdk and bpf (bb9c485d)