如何在Mellanox ConnectX-4上为DPDK启用RX巨帧卸载?
问题描述
我正尝试在Ubuntu 20.04.6 LTS上运行DPDK应用,使用的组件如下:
- Ubuntu 20.04.6 LTS
$ uname -a Linux the-hostname-001 5.4.0-169-generic #187-Ubuntu SMP Thu Nov 23 14:52:28 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
- Mellanox Technologies MT27700 Family [ConnectX-4]
$ lspci -vvv | grep -i mellanox d8:00.0 Ethernet controller: Mellanox Technologies MT27700 Family [ConnectX-4] Subsystem: Mellanox Technologies ConnectX-4 Stand-up dual-port 100GbE MCX416A-CCAT d8:00.1 Ethernet controller: Mellanox Technologies MT27700 Family [ConnectX-4] Subsystem: Mellanox Technologies ConnectX-4 Stand-up dual-port 100GbE MCX416A-CCAT
- DPDK 22.11.1
- Fastclick 2.1
我尝试通过以下Click路由器配置在两个DPDK端口之间搭建简单网桥:
FromDPDKDevice(0, PROMISC true, JUMBO true, MTU 9000) -> ToDPDKDevice(1); FromDPDKDevice(1, PROMISC true, JUMBO true, MTU 9000) -> ToDPDKDevice(0);
我的接口已配置为MTU 9000:
$ ip link sh 4: ens50f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether <hidden mac addr> brd ff:ff:ff:ff:ff:ff 5: ens50f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether <hidden mac addr> brd ff:ff:ff:ff:ff:ff
运行程序时得到如下输出:
$ sudo ./fastclick-main/bin/click --dpdk -a d8:00.0 -a d8:00.1 -c 0xFFF0 -n 4 --socket-mem 16000,16000 -- --file bridge.click EAL: Detected CPU lcores: 48 EAL: Detected NUMA nodes: 2 EAL: Detected static linkage of DPDK EAL: Multi-process socket /var/run/dpdk/rte/mp_socket EAL: Selected IOVA mode 'PA' EAL: VFIO support initialized EAL: Probe PCI driver: mlx5_pci (15b3:1013) device: 0000:d8:00.0 (socket 1) mlx5_net: Default miss action is not supported. EAL: Probe PCI driver: mlx5_pci (15b3:1013) device: 0000:d8:00.1 (socket 1) mlx5_net: Default miss action is not supported. Initializing DPDK /home/user1/bridge.click:2: While initializing ‘ToDPDKDevice@4 :: ToDPDKDevice’: Rx jumbo frame offload is not supported by this device!
我想知道是否有标准方法确保我的mlx5设备支持"RX jumbo frame offload"。我意识到该错误信息是Fastclick应用特有的,但这更像是DPDK + mlx5设备的问题,怀疑是否在DPDK编译过程中遗漏了某些参数。我已确保接口在启动时启用并设置MTU为9000,但仍出现该错误。
解决方案
1. 确认DPDK mlx5驱动的巨帧支持状态
ConnectX-4硬件本身支持巨帧,但DPDK mlx5驱动对RX巨帧卸载的支持需要满足两个核心条件:
- 检查编译选项:进入DPDK编译目录,执行以下命令验证
MLX5_RX_JUMBO_FRAME是否启用:
若输出为grep -r MLX5_RX_JUMBO_FRAME build/.configCONFIG_RTE_LIBRTE_MLX5_RX_JUMBO_FRAME=y则表示已启用;若为n或无结果,需重新编译DPDK并开启该选项。 - 检查固件版本:ConnectX-4需要固件版本≥12.20.1000,过低版本可能缺失卸载支持。执行以下命令查看固件版本:
版本不足时,升级至官方稳定版。mlxfwmanager --query
2. 用DPDK testpmd验证端口巨帧能力
使用DPDK自带的testpmd工具直接检测网卡的RX巨帧卸载支持:
- 启动testpmd:
sudo dpdk-testpmd -a d8:00.0 -a d8:00.1 -c 0xFFF0 -n 4 --socket-mem 16000,16000 -- --port-topology=chained - 在交互界面中查看端口特性:
查找show port info 0Rx offload capabilities部分,确认是否包含JUMBO_FRAME。若无此条目,说明驱动或硬件配置存在问题。
3. 调整FastClick配置参数
FastClick的JUMBO参数可能触发了对RX巨帧卸载的强制检查,而mlx5驱动的巨帧处理逻辑无需显式开启该选项:
- 移除
JUMBO true参数,仅保留MTU 9000,mlx5驱动会自动适配巨帧:FromDPDKDevice(0, PROMISC true, MTU 9000) -> ToDPDKDevice(1); FromDPDKDevice(1, PROMISC true, MTU 9000) -> ToDPDKDevice(0); - 若必须保留
JUMBO参数,可检查FastClick的DPDK适配代码,确认其对DEV_RX_OFFLOAD_JUMBO_FRAME标志的判断逻辑是否适配mlx5驱动。
4. 检查系统驱动绑定与网卡配置
- 确认驱动绑定状态:使用
dpdk-devbind.py检查网卡是否绑定到DPDK兼容驱动(如vfio-pci):
若绑定到内核驱动sudo dpdk-devbind.py --statusmlx5_core,执行以下命令切换:sudo dpdk-devbind.py --bind=vfio-pci d8:00.0 d8:00.1 - 启用网卡巨帧卸载:执行以下命令检查并开启网卡的RX巨帧卸载:
对另一个端口重复上述操作。ethtool -k ens50f0 | grep jumbo sudo ethtool -K ens50f0 rx-jumbo-frame on
5. 重新编译DPDK与FastClick
若上述步骤无效,重新编译组件确保依赖正确:
- 编译DPDK时启用全量mlx5相关选项:
meson setup build -Dprefix=/usr/local/dpdk -Dlibdpdk=librte-all -Ddrivers=net/mlx5 ninja -C build sudo ninja -C build install - 编译FastClick时指定DPDK路径:
./configure --enable-dpdk --with-dpdk=/usr/local/dpdk make
内容的提问来源于stack exchange,提问作者cgonchar
相关产品推荐
相关产品推荐

