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 在整个处理流程中的位置

|500

图中描述的 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 modeOffloaded modeGeneric Mode
kernel 标志位XDP_FLAGS_DRV_MODEXDP_FLAGS_HW_MODEXDP_FLAGS_SKB_MODE
libxdp 标志位XDP_MODE_NATIVEXDP_MODE_HWXDP_MODE_SKB
运行位置内核空间的网络驱动程序层网卡硬件网络栈的更高层次
处理路径驱动程序内处理,路径短网卡内处理,路径极短网络栈的早期阶段,但在硬件驱动之后.
硬件依赖依赖于特定的网络驱动程序依赖于支持 XDP Offload 的智能网卡不依赖特定硬件,几乎所有网卡都支持
性能性能极高性能最高性能较低, 与 native 性能差距 10 倍
延迟非常低最低较高
开发复杂度需要内核和驱动程序知识,较复杂需要硬件编程知识和工具,复杂开发和调试相对简单
适用范围需要驱动支持,适用范围有限需要特定硬件,适用于高流量和低延迟场景广泛兼容,适用于几乎所有网卡
成本受限于驱动支持,无额外硬件成本需要昂贵的智能网卡,硬件成本较高无额外硬件成本
  • libxdp 还有一种: XDP_MODE_UNSPEC, 执行 xdp_program__attach 时内核决定以那种方式运行 xdp: 依次是 hw naive skb.

Xsk

xsk: af_xdp 类型的 socket, 能够直接从 xdp 收包,绕过内核协议栈.

这里偷 cloudflare 两张图
|500

UMEM 是 kernel 和 user 共享的一块内存区域, 真正 pkt 信息会被写入到 umem;

  • 整个内存区域被划分为了固定的大小的格子, 一个格子是一个 frame.
  • frame 大小可以是非固定的, 但这里只讨论 frame 大小固定情况, 典型的 frame 大小是 4096 字节 (libxdp 默认)

在 fill queue/ rx queue / tx queue / conpltion queue 这 4 个 ring 中存储的只是相对 UMEM 开始部分的偏移

  • 相当于 4 个 ring 中读写的只是 索引.

|900

xsk 原理分析, 已经又不少质量很高的资料了 (质量真的很高).

  • 首先先看下 ebpf 文档: How it works, 这一篇非常详细的描述了单个 pkt 收发.
  • 然后是 cloudflare 这篇 一个调试故事:AF_XDP 中的受损数据包;是内核错误还是用户错误?

结合代码的讲解, 下面两篇非常不错.

  • AF_XDP技术详解
  • 使用AF_XDP Socket更高效的网络传输

理解 ring 工作

  • 解读eBPF XDP性能之路:它如何向着DPDK看齐?它在实际中又能带来多大效益?

尾巴

这篇是从 xks 的一篇大长篇草稿中截取的, 因此有些凌乱….

让我们继续 xdp 之旅


  1. xdp 内丢弃重定向的包不会显示在 tcpdump, 要使用 xdpdump. ↩︎