You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PcapPlusPlus DPDKFilterTraffic性能未达预期,是否配置有误?

问题描述

环境配置

  • 硬件:Mellanox ConnectX-5网卡
  • 系统:Ubuntu 22.04.01
  • DPDK/PcapPlusPlus:最新版本
  • 内核:5.15.0-53-generic
  • 大页:10个1GB大页

网卡详细信息

Device #1:
----------

  Device Type:      ConnectX5
  Part Number:      MCX516A-CCA_Ax
  Description:      ConnectX-5 EN network interface card; 100GbE dual-port QSFP28; PCIe3.0 x16; tall bracket; ROHS R6
  PSID:             MT_0000000012
  PCI Device Name:  /dev/mst/mt4119_pciconf0
  Base GUID:        b8cef60300fb1330
  Base MAC:         b8cef6fb1330
  Versions:         Current        Available     
     FW             16.35.1012     N/A           
     PXE            3.6.0804       N/A           
     UEFI           14.28.0015     N/A           

  Status:           No matching image found

网卡链路配置(ethtool输出)

Settings for ens7f0np0:
        Supported ports: [ Backplane ]
        Supported link modes:   1000baseKX/Full
                                10000baseKR/Full
                                40000baseKR4/Full
                                40000baseCR4/Full
                                40000baseSR4/Full
                                40000baseLR4/Full
                                25000baseCR/Full
                                25000baseKR/Full
                                25000baseSR/Full
                                50000baseCR2/Full
                                50000baseKR2/Full
                                100000baseKR4/Full
                                100000baseSR4/Full
                                100000baseCR4/Full
                                100000baseLR4_ER4/Full
        Supported pause frame use: Symmetric
        Supports auto-negotiation: Yes
        Supported FEC modes: None        RS      BASER
        Advertised link modes:  100000baseKR4/Full
                                100000baseSR4/Full
                                100000baseCR4/Full
                                100000baseLR4_ER4/Full
        Advertised pause frame use: Symmetric
        Advertised auto-negotiation: No
        Advertised FEC modes: RS
        Speed: 100000Mb/s
        Duplex: Full
        Auto-negotiation: off
        Port: Direct Attach Copper
        PHYAD: 0
        Transceiver: internal
netlink error: Operation not permitted
        Current message level: 0x00000004 (4)
                               link
        Link detected: yes

测试场景与问题

tcpdump单端口测试

执行命令:

sudo tcpdump -i ens7f0np0 udp -nn -# -N -B 1048576 -t -q -Q in -p -w /mnt/md0/test/test.pcap dst port 50340

1秒测试生成2GB pcap文件,符合预期;但双端口采集时内核无法处理,出现丢包,因此转向DPDK方案。

PcapPlusPlus DpdkTrafficFilter测试

执行命令:

sudo ./DpdkTrafficFilter -d 2 -f /mnt/md0/ -o 'UDP' -c 7 

输出日志:

EAL: Detected CPU lcores: 56
EAL: Detected NUMA nodes: 2
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available 2048 kB hugepages reported
EAL: VFIO support initialized
EAL: Probe PCI driver: mlx5_pci (15b3:1015) device: 0000:17:00.0 (socket 0)
mlx5_net: No available register for sampler.
EAL: Probe PCI driver: mlx5_pci (15b3:1015) device: 0000:17:00.1 (socket 0)
mlx5_net: No available register for sampler.
EAL: Probe PCI driver: mlx5_pci (15b3:1017) device: 0000:31:00.0 (socket 0)
EAL: Probe PCI driver: mlx5_pci (15b3:1017) device: 0000:31:00.1 (socket 0)
EAL: Probe PCI driver: mlx5_pci (15b3:1015) device: 0000:b1:00.0 (socket 1)
mlx5_net: No available register for sampler.
EAL: Probe PCI driver: mlx5_pci (15b3:1015) device: 0000:b1:00.1 (socket 1)
mlx5_net: No available register for sampler.
EAL: Probe PCI driver: mlx5_pci (15b3:1015) device: 0000:ca:00.0 (socket 1)
mlx5_net: No available register for sampler.
EAL: Probe PCI driver: mlx5_pci (15b3:1015) device: 0000:ca:00.1 (socket 1)
mlx5_net: No available register for sampler.
EAL: Probe PCI driver: mlx5_pci (15b3:1015) device: 0000:e3:00.0 (socket 1)
mlx5_net: No available register for sampler.
EAL: Probe PCI driver: mlx5_pci (15b3:1015) device: 0000:e3:00.1 (socket 1)
mlx5_net: No available register for sampler.
TELEMETRY: No legacy callbacks, legacy socket not created
Opened device #2 with 1 RX queues and 1 TX queues. RSS hash functions:
   RSS_IPV4
   RSS_IPV6
Using core 1
   Core configuration:
      DPDK device#2: RX-Queue#0;  
Using core 2
   Core configuration:
      None
^C
Application stopped
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Core ID | Packet Cnt  | Eth Cnt     | ARP Cnt     | IPv4 Cnt    | IPv6 Cnt    | TCP Cnt     | UDP Cnt     | HTTP Cnt    | Matched TCP Flows  | Matched UDP Flows  | Matched Packets    |
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| 1       | 514051      | 514051      | 0           | 514051      | 0           | 0           | 514051      | 0           | 0                  | 1                  | 514050             |
| 2       | 0           | 0           | 0           | 0           | 0           | 0           | 0           | 0           | 0                  | 0                  | 0                  |
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Total   | 514051      | 514051      | 0           | 514051      | 0           | 0           | 514051      | 0           | 0                  | 1                  | 514050             |
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1秒测试仅生成725MB pcap文件,远低于预期,且性能不如tcpdump。已修改代码设置MTU为9000,但无改善。

疑问:

  1. 配置哪里有误?
  2. 是否存在丢包?
  3. 为何性能不如tcpdump?

问题分析与解决方案

1. 性能差异与丢包原因

(1)RX队列与CPU核绑定瓶颈

从日志可见,仅给DPDK设备分配了1个RX队列,且仅绑定到1个CPU核(core 1),core 2完全闲置。对于100Gbps链路+9000字节MTU的流量,单队列单核的处理能力会被打满:

  • 9000字节UDP包的理论最大吞吐量约为1.38Mpps,但单CPU核的实际包处理能力通常在1Mpps以内,测试中仅处理了~514kpps,说明单核已过载,导致网卡侧丢包。

(2)大页配置不匹配

日志显示EAL: No available 2048 kB hugepages reported,虽然配置了1GB大页,但DPDK默认优先尝试2MB大页,内存分配效率降低会间接影响性能。

(3)示例程序的额外开销

DpdkTrafficFilter包含协议解析、流量匹配逻辑,这些额外操作会占用CPU资源,相比tcpdump的极简抓包逻辑,开销更大,导致性能下降。

(4)NUMA亲和性未优化

系统有2个NUMA节点,但当前配置未将DPDK设备、大页、CPU核绑定到同一NUMA节点,跨NUMA访问会增加内存延迟,降低处理效率。

2. 具体调整建议

(1)增加RX队列并绑定多CPU核

给每个端口分配2-4个RX队列,将每个队列绑定到同NUMA节点的空闲CPU核。修改代码或启动参数,调整队列数量与核绑定关系。

(2)强制使用1GB大页

启动DPDK应用时添加参数:

--huge-dir /dev/hugepages-1GB

避免2MB大页缺失的问题,提升内存分配效率。

(3)优化写文件逻辑

  • 采用多线程分队列写文件,或批量写入(攒够一定数量的包再写入磁盘),减少磁盘IO的系统调用开销。
  • 跳过不必要的协议解析:如果仅需保存payload,直接写入原始包数据,去掉协议解析步骤。

(4)配置NUMA亲和性

  • 将大页分配到网卡所在NUMA节点(以socket 0为例):
    echo 10 > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages
    
  • 启动应用时指定NUMA节点与同节点CPU核:
    --numa-socket-num 0 -l 1-4
    

(5)检查网卡丢包统计

使用dpdk-testpmd工具确认网卡侧丢包:

sudo dpdk-testpmd -l 1-4 -n 4 -- --portmask=0x2 --rxq=4 --txq=4 --stats-period=1

在testpmd中输入start收包,一段时间后输入show port stats all查看丢包情况。

3. 验证调整效果

调整后重新测试,对比每秒生成的pcap文件大小,同时观察CPU使用率、网卡丢包统计,确认瓶颈是否解除。

内容的提问来源于stack exchange,提问作者adastra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:25:20