XDP-1-xdp & af_xdp 速览 & 资料汇总
xdp & af_xdp 速览 & 资料汇总
资料来源:
- <>
更新
1
2024.12.10 初始
导语
简述 xdp 和 af_xdp;
- 个人能力有限, 写的肯定不好, 只能算是给自己的备份;
- 引用了很多文献, 已标明出处.
- 还是那句话: 弱水三千只取一瓢, 一瓢太多, 就看个倒影 也足够使用了.
资料
官方文档: 最权威参考
- ebpf 文档 AF_XDP
- kernel 文档 AF_XDP
案例 & 教程, issues 信息也相当受用.
- xdp-tutorial
- AF_XDP: 完整的 xsk 示例
- bpf-examples
- AF_XDP-example: 基准的接收 发送 多个 xsk 共享一个 队列.
- AF_XDP-forwarding: 多线程,在不同 xsk 之间 forward pkt, 共享全局一个 umem.
一些不错的参考
- AF_XDP技术详解: 讲解细致, 注意: 其使用的是 libbpf 而不是 libxdp, libxdp 会节省非常多代码.
- A story about AF_XDP, network namespaces and a cookie (cloudflare.com): cloudflare 就不多说了吧, 博文质量甚高.
- 一个调试故事:AF_XDP 中的受损数据包;是内核错误还是用户错误?: 同样是 cloudflare 的博文
- 使用AF_XDP Socket更高效的网络传输
Xdp
xdp: eXpress Data Path 快速数据路径, 内核旁路 (Kernel bypass) 技术, pkt 在进入内核前,直接处理 L2 的包;
图描述了 xdp 在整个处理流程中的位置
图中描述的 XDP 动作:
- XDP_PASS: 正常进入内核协议栈
- XDP_DROP: 直接丢弃 [1]
- XDP_ABORTED: indicate an error (the packet is dropped), trigger xdp:xdp_exception tracepoint
- XDP_TX: emit the packet back out the interface on which it was received
- XDP_REDIRECT: 另一个网卡 NIC 或 AF_XDP socket ^vqlu9
与 dpdk 的对比
- 个人愚见, xpd 优势在于与 kernel 的紧密结合,而不是完全抛开 kernel 另起炉灶.
xdp 运行的 3 种模式
特性 | Native mode | Offloaded mode | Generic Mode |
---|---|---|---|
kernel 标志位 | XDP_FLAGS_DRV_MODE | XDP_FLAGS_HW_MODE | XDP_FLAGS_SKB_MODE |
libxdp 标志位 | XDP_MODE_NATIVE | XDP_MODE_HW | XDP_MODE_SKB |
运行位置 | 内核空间的网络驱动程序层 | 网卡硬件 | 网络栈的更高层次 |
处理路径 | 驱动程序内处理,路径短 | 网卡内处理,路径极短 | 网络栈的早期阶段,但在硬件驱动之后. |
硬件依赖 | 依赖于特定的网络驱动程序 | 依赖于支持 XDP Offload 的智能网卡 | 不依赖特定硬件,几乎所有网卡都支持 |
性能 | 性能极高 | 性能最高 | 性能较低, 与 native 性能差距 10 倍 |
延迟 | 非常低 | 最低 | 较高 |
开发复杂度 | 需要内核和驱动程序知识,较复杂 | 需要硬件编程知识和工具,复杂 | 开发和调试相对简单 |
适用范围 | 需要驱动支持,适用范围有限 | 需要特定硬件,适用于高流量和低延迟场景 | 广泛兼容,适用于几乎所有网卡 |
成本 | 受限于驱动支持,无额外硬件成本 | 需要昂贵的智能网卡,硬件成本较高 | 无额外硬件成本 |
- libxdp 还有一种:
XDP_MODE_UNSPEC
, 执行xdp_program__attach
时内核决定以那种方式运行 xdp: 依次是 hw naive skb.
Xsk
xsk: af_xdp 类型的 socket, 能够直接从 xdp 收包,绕过内核协议栈.
这里偷 cloudflare 两张图
UMEM 是 kernel 和 user 共享的一块内存区域, 真正 pkt 信息会被写入到 umem;
- 整个内存区域被划分为了固定的大小的格子, 一个格子是一个 frame.
- frame 大小可以是非固定的, 但这里只讨论 frame 大小固定情况, 典型的 frame 大小是 4096 字节 (libxdp 默认)
在 fill queue/ rx queue / tx queue / conpltion queue 这 4 个 ring 中存储的只是相对 UMEM 开始部分的偏移
- 相当于 4 个 ring 中读写的只是 索引.
xsk 原理分析, 已经又不少质量很高的资料了 (质量真的很高).
- 首先先看下 ebpf 文档: How it works, 这一篇非常详细的描述了单个 pkt 收发.
- 然后是 cloudflare 这篇 一个调试故事:AF_XDP 中的受损数据包;是内核错误还是用户错误?
结合代码的讲解, 下面两篇非常不错.
- AF_XDP技术详解
- 使用AF_XDP Socket更高效的网络传输
理解 ring 工作
- 解读eBPF XDP性能之路:它如何向着DPDK看齐?它在实际中又能带来多大效益?
尾巴
这篇是从 xks 的一篇大长篇草稿中截取的, 因此有些凌乱….
让我们继续 xdp 之旅
xdp 内丢弃重定向的包不会显示在 tcpdump, 要使用 xdpdump. ↩︎