经过Mellanox ConnectX NIC使用XDP加速linux
Accelerating with XDP over Mellanox ConnectX NICs编程
XDP(eXpress Data Path)是Linux内核网络堆栈中的可编程数据路径。为BPF提供了一个框架,能够在运行时实现高性能的包处理。XDP与Linux网络堆栈协同工做,不是内核旁路。 网络
因为XDP运行在内核网络驱动程序中,能够从网卡的RX环读取以太网帧并当即采起运行。XDP经过在驱动程序中实现的RX钩子插入eBPF基础架构。XDP是EBPF的一个应用程序,可使用返回码触发操做、修改包内容和推/拉头文件信息。 架构
XDP有各类各样的用例,好比包过滤、包转发、负载平衡、DDOS缓解等等。一个常见的用例是XDP_DROP,指示驱动程序丢弃数据包。这能够经过运行自定义BPF程序来解析在驱动程序中接收到的传入数据包来完成。这个程序返回一个决策判断或返回码(XDP_DROP),其中数据包在驱动程序级被丢弃,而不会浪费任何进一步的资源。Ethtool计数器可用于验证XDP程序的操做。app
XDP程序一进入网络驱动程序就运行,从而提升了网络性能。还提升了CPU利用率。Mellanox ConnectX NIC系列容许NIC硬件准备元数据。此元数据可用于对使用XDP的应用程序执行硬件加速。 框架
下面是一个如何使用Mellanox ConnectX-5运行XDP_DROP的示例。 性能
检查当前内核是否支持bpf和xdp:3d
sysctl net/core/bpf_jit_enablecode
若是找不到,请编译并运行启用了BPF的内核。可使用任何大于5.0的上游内核。 blog
启用如下kconfig标志:
创新启动新的kernel.
Install clang and llvm:
yum install -y llvm clang libcap-devel
按照如下方法编译
cd <linux src code> make samples/bpf/
这将编译全部可用的XDP应用程序。编译完成后,将看到/sample/bpf下的全部XDP应用程序(图1)。
Figure 1. XDP applications under /sample/bpf.
在前面的安装中,如今能够运行XDP应用程序了。能够在两种模式下运行:
驱动程序路径必须在驱动程序中具备实现。以页面分辨率工做,不建立SKB。性能明显提升。Mellanox NIC支持此模式。
通用路径适用于任何网络设备。与SKBs合做,但性能更差。
在驱动程序路径中运行XDP_DROP。XDP_DROP是在Linux中丢弃数据包最简单、最快的方法之一。在这里,指示驱动程序在驱动程序的最先Rx阶段丢弃数据包。这意味着数据包被回收回刚刚到达的RX环队列中。
位于<linux\u source>/samples/bpf/implements XDP Drop的xdp1应用程序。
选择选择的流量生成器。使用Cisco TRex。
在RX端,使用如下命令在驱动程序路径中启动xdp1:
<PATH_TO_LINUX_SOURCE>/samples/bpf/xdp1 -N <INTERFACE> # -N can be omitted
可使用应用程序输出,同时ethtool计数器显示XDP丢弃率:
ethtool -S <intf> | grep -iE rx[0-9]*_xdp_drop
Figure 2. Verify XDP drop counter using ethtool counters.