绑定DPDK的端口无法通过dpdk-dumpcap捕获入站数据包问题
DPDK抓包无数据问题排查与解决
核心问题场景
两块物理网卡各含2个QSFP28端口,内部拆分后每块拥有8个端口,且两块网卡通过线缆直连:
- 发包端:网卡绑定内核驱动,通过
tcpreplay从ens5f3端口发送pcap数据包 - 抓包端:网卡绑定DPDK驱动,使用
dpdk-testpmd和dpdk-dumpcap均无法捕获数据包,但解绑DPDK驱动并重新绑定内核驱动后,tcpdump可正常抓包
排查与解决步骤
1. 确认DPDK端口匹配与启用状态
DPDK应用默认可能仅初始化部分端口,或抓包端口与实际收包物理端口不匹配:
- 执行命令查看绑定DPDK驱动的所有端口PCI地址:
dpdk-devbind.py --status - 启动
dpdk-testpmd时明确指定启用所有8个端口(根据实际端口数调整掩码):build/app/dpdk-testpmd -c 0xf0 -n 4 -- -i --port-topology=chained --portmask=0xff - 在testpmd交互模式下启动收包并查看统计:
若testpmd能统计到RX数据包,说明DPDK端口本身可接收,问题出在testpmd> start # 此时执行tcpreplay发包 testpmd> show port stats alldpdk-dumpcap配置。
2. 调整DPDK抓包工具的核心与队列配置
默认配置下,dpdk-dumpcap的RX队列或核心绑定可能存在问题:
- 指定核心与端口启动
dpdk-dumpcap(核心掩码0x10对应核心4,-i 0对应监听端口0,按需调整):build/app/dpdk-dumpcap -c 0x10 -n 4 -- -i 0 -w /tmp/capture.pcapng - 确保指定的核心未被其他进程占用,可通过
htop查看核心负载。
3. 配置DPDK端口为混杂/多播接收模式
若端口未启用混杂模式,可能过滤掉非自身MAC的数据包:
- 在testpmd交互模式下配置端口参数:
配置完成后重新启动收包测试。testpmd> port config 0 promisc on testpmd> port config 0 allmulticast on testpmd> port config 0 mtu 1500 # 与发包端网卡MTU保持一致
4. 验证驱动兼容性与加载状态
从日志看使用ice驱动,可能存在版本兼容或驱动未正确加载的问题:
- 确认DPDK版本与
ice驱动版本匹配(推荐使用DPDK稳定版如22.11/23.11) - 重新加载DPDK驱动模块(以
igb_uio为例):rmmod igb_uio insmod build/kmod/igb_uio.ko - 若使用
vfio-pci驱动,需确保已启用IOMMU并正确加载模块。
5. 确认直连端口对应关系
可能存在抓包端口与发包端直连端口不匹配的情况:
- 执行命令点亮发包端网卡端口指示灯:
ethtool -p ens5f3 - 对照
dpdk-devbind.py --status的PCI地址,找到对应亮灯的DPDK端口,确保dpdk-dumpcap监听该端口。
内容的提问来源于stack exchange,提问作者Anoop C
相关产品推荐
相关产品推荐

