XDP(eXpress Data Path)为 Linux 内核提供了高性能、可编程的网络数据路径。由于网络包在还未进入网络协议栈之前就处理,它给Linux网络带来了巨大的性能提升(性能比DPDK还要高)。
XDP基于一系列的技术来实现高性能和可编程性,包括
- 基于eBPF
- Capabilities negotiation:通过协商确定网卡驱动支持的特性,XDP尽量利用新特性,但网卡驱动不需要支持所有的特性
- 在网络协议栈前处理
- 无锁设计
- 批量I/O操作
- 轮询式
- 直接队列访问
- 不需要分配skbuff
- 支持网络卸载
- DDIO
- XDP程序快速执行并结束,没有循环
- Packeting steering
包处理逻辑
如下图所示,基于内核的eBPF程序处理包,每个 RX 队列分配一个CPU,且以每个网络包一个Page(packet-page)的方式避免分配skbuff。
与DPDK对比
相对于DPDK,XDP具有以下优点
- 无需第三方代码库和许可
- 同时支持轮询式和中断式网络
- 无需分配大页
- 无需专用的CPU
- 无需定义新的安全网络模型
示例
缺点
注意XDP的性能提升是有代价的,它牺牲了通用型和公平性
- XDP不提供缓存队列(qdisc),TX设备太慢时直接丢包,因而不要在RX比TX快的设备上使用XDP
- XDP程序是专用的,不具备网络协议栈的通用性
参考资料
- Introduction to XDP
- Network Performance BoF
- Linux Network Stack
- eXpress Data Path
- Netdev 1.2 - Fast Programmable Networks & Encapsulated Protocols - David S. Miller
- Leveraging XDP for Programmable, High Performance Data Path in OpenStack
- eXpress Data Path: Getting Linux to 20Mpps
- XDP – Intro and Future Use Cases
- XDP Workshop: Introduction, Experience and Future Development
- https://blogs.igalia.com/dpino/2019/01/07/introduction-to-xdp-and-ebpf/