XDP 挂载模式剖析
XDP挂载模式对比 了解XDP的读者应该知道:XDP是基于eBPF的一个高性能网络路径技术,它的原理就是在数据包处理的早期阶段(在内核网络协议栈之前)挂载eBPF程序对数据包进行处理,从而实现高效的网络数据包处理。如果你写过XDP程序,那么一定知道挂载XDP的时候有多种模式可选,不同模式之间的效率不同。这篇文章我们就来深入剖析一下XDP的集中模式之间到底有哪些区别。 首先看看XDP挂载模式有哪几种?不同的挂载模式有和区别? XDP挂载模式可以以三种方式挂在到网卡上: Generic Native Offloaded 兼容性 兼容所有网络设备 需要网卡驱动显示支持XDP 特定的可编程网卡 执行阶段 在网络核心代码中执行(此时已经分配了SKB) 在网卡驱动中执行(还未分配SKB) 网卡执行,CPU零开销 性能 较低 高 最高 XDP 挂载原理 XDP程序是挂载在网络数据包的处理路径上的,所以我们有必要先对网络数据包的处理路径有一个整体的掌握(这里插播一条小广告,我之前写过一篇分析数据包从网卡到内核协议栈的博客)。 数据包从网卡到内核网络协议栈的流程可以分为以下几个步骤: 数据包到达网卡 网卡硬件接收以太帧,做基本校验(如 CRC)。 DMA 写入内存 网卡通过 DMA 将数据包写入驱动预先分配好的接收缓冲区(Descriptor Ring)。 中断通知 CPU 网卡通过 IRQ 告诉 CPU:“我收到了新数据包”。 驱动中断处理函数(ISR) 驱动快速处理中断,通常只是调用 __napi_schedule(),把 NAPI poll 加入调度队列。 软中断调度 NAPI poll CPU 执行 do_softirq() → net_rx_action() → 调用 网卡的的 poll 函数。 poll 函数提取数据包并构造 skb 驱动在 poll 中读取 DMA ring 的描述符,把数据包封装进 sk_buff 结构,交给网络核心层。 网络核心层处理 网络核心层根据数据包格式选择对应的协议栈,然后交给协议栈处理。 XDP就是挂载在上面的某个阶段,从而实现高效网络数据包处理的。具体来说Native模式的XDP是在网卡的驱动程序中执行的(对应步骤6),而Generic模式的XDP是在网络核心层中执行的(对应步骤7)。这也说明了Native模式的性能比Generic模式高。 ...