DOCA simple_fwd_vnf APP在使用时出现了SF处流量骤降的情况

我在 BF3 上运行simple_fwd_vnf应用程序时遇到了一个问题。我按照文档配置了端口:将 SF4 和 p0 添加到网桥br1,将 SF3 和 pf0hpf 添加到网桥br2。使用 另一个主机的testpmd 的 txonly 模式向当前主机发送数据包,我观察到启动 SF3 和 SF2 之间的存在流量,但包率明显下降。这可能是什么原因造成的?是否缺少某些配置导致流表无法卸载,还是说SF的能力有限?
OVS bridge:pf0hpf->SF5->simple_fwd_vnf->SF4->p0
此外,我观察到一个奇怪的现象:当使用 testpmd 发送数据包时,在接收端运行 simple_fwd_vnf,如果我设置更大的数据包长度(例如 1024 字节),发送端的数据包率会在11Mpps 左右,simple_fwd_vnf 就可以正常运行。SF5与SF4之间的流量正常。而如果我减少包长哪怕是到900,发送端包率会到13Mpps,SF5和SF4之间的包率会快速下跌到到0.6Mpps。
我尝试用固定包长64的报文来发包,同时通过调整发送端tx队列来调整包率。我也发现了发送队列的个数在4和5之间时,SF5和SF4之间的包率也有断崖式下降。这个现象是否说明包率上升到一定阈值会影响DOCA Flow 应用的正常运行?是否因为SF的配置错误导致其同时无法处理太多报文?
这个问题困扰了我很久,希望得到您的帮助。@YanNVIDIA
包长为1024时,使用sar -n DEV 1命令的结果:

tx:
17:29:03 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
17:29:04 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17:29:04 oob_net0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17:29:04 tmfifo_net0 9.00 14.00 0.86 4.77 0.00 0.00 0.00 0.00
17:29:04 p0 11635037.00 11725124.00 11680483.47 11770926.79 0.00 0.00 0.00 96.43
17:29:04 p1 1.00 0.00 0.12 0.00 0.00 0.00 1.00 0.00
17:29:04 pf0hpf 11725105.00 11634970.00 11725105.00 11634970.00 0.00 0.00 0.00 96.05
17:29:04 en3f0pf0sf4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17:29:04 enp3s0f0s2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17:29:04 en3f0pf0sf3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17:29:04 enp3s0f0s3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17:29:04 ovs-doca 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17:29:04 ovsbr1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
rx
21:01:13 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
21:01:14 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:01:14 oob_net0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:01:14 tmfifo_net0 8.00 8.00 0.52 4.93 0.00 0.00 0.00 0.00
21:01:14 p0 11907254.00 11825841.00 11953761.69 11871985.96 0.00 0.00 0.00 97.93
21:01:14 p1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:01:14 ovs-doca 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:01:14 pf0hpf 11836601.00 11836630.00 11836601.00 11836630.00 0.00 0.00 0.00 96.97
21:01:14 pf1hpf 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:01:14 en3f0pf0sf0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:01:14 enp3s0f0s0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:01:14 en3f1pf1sf0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:01:14 enp3s0f1s0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:01:14 en3f0pf0sf4 11857532.00 11937010.00 11857532.00 11937010.00 0.00 0.00 0.00 97.79
21:01:14 enp3s0f0s4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:01:14 en3f0pf0sf5 11878084.00 11878104.00 11878084.00 11878104.00 0.00 0.00 0.00 97.31
21:01:14 enp3s0f0s5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:01:14 br1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:01:14 br2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

包长为900时,使用sar -n DEV 1命令的结果:

tx:
17:31:31 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
17:31:32 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17:31:32 oob_net0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17:31:32 tmfifo_net0 5.00 5.00 0.32 4.16 0.00 0.00 0.00 0.00
17:31:32 p0 60998.00 13774383.00 53848.24 12160196.59 0.00 0.00 0.00 99.62
17:31:32 p1 2.00 0.00 0.21 0.00 0.00 0.00 2.00 0.00
17:31:32 pf0hpf 13774472.00 61071.00 12106469.53 53674.89 0.00 0.00 0.00 99.18
17:31:32 en3f0pf0sf2 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17:31:32 enp3s0f0s2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17:31:32 en3f0pf0sf3 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17:31:32 enp3s0f0s3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17:31:32 ovs-doca 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17:31:32 ovsbr1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
rx:
21:04:05 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
21:04:06 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:04:06 oob_net0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:04:06 tmfifo_net0 29.00 43.00 1.87 8.30 0.00 0.00 0.00 0.00
21:04:06 p0 13895777.00 61263.00 12267367.40 54083.74 0.00 0.00 0.00 100.49
21:04:06 p1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:04:06 ovs-doca 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:04:06 pf0hpf 64259.00 64260.00 56477.64 56478.52 0.00 0.00 0.00 0.46
21:04:06 pf1hpf 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:04:06 en3f0pf0sf0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:04:06 enp3s0f0s0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:04:06 en3f1pf1sf0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:04:06 enp3s0f1s0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:04:06 en3f0pf0sf4 60122.00 12221279.00 52841.60 10741358.50 0.00 0.00 0.00 87.99
21:04:06 enp3s0f0s4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:04:06 en3f0pf0sf5 62652.00 62644.00 55065.23 55058.20 0.00 0.00 0.00 0.45
21:04:06 enp3s0f0s5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:04:06 br1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:04:06 br2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

下面是一些相关信息,希望帮助您定位:

root@localhost:/home/ubuntu# sudo ovs-dpctl show
system@ovs-system:
lookups: hit:402709 missed:5390360 lost:4637436
flows: 1
masks: hit:5811697 total:1 hit/pkt:1.00
cache: hit:401769 hit-rate:6.94%
caches:
masks-cache: size:256
port 0: ovs-system (internal)
port 1: p1
port 2: ovsbr2 (internal)
port 3: p0
port 4: br1 (internal)
port 5: br2 (internal)
port 6: pf0hpf
port 7: pf1hpf
port 8: en3f0pf0sf4
port 9: en3f0pf0sf5
root@localhost:/opt/mellanox/doca/applications# sudo ovs-vsctl list Open_vSwitch
_uuid : a0c32fa2-e289-4a0f-bbf5-627e64cbbba1
bridges : [086cbd16-1d65-4282-838c-09655fca09de, a1c1d2ea-895d-4808-992c-2f8a3ef98595]
cur_cfg : 377
datapath_types : [doca, netdev, system]
datapaths : { }
db_version : “8.5.1”
doca_initialized : true
doca_version : “3.0.0058”
dpdk_initialized : true
dpdk_version : “MLNX_DPDK 22.11.2504.1.0”
external_ids : {hostname=localhost.localdomain, rundir=“/var/run/openvswitch”, system-id=“206ee97f-1ad9-4f0d-b6db-963b74694411”}
iface_types : [bareudp, doca, docavdpa, docavhostuser, docavhostuserclient, dpdk, dpdkvhostuser, dpdkvhostuserclient, erspan, geneve, gre, gtpu, internal, ip6erspan, ip6gre, lisp, patch, srv6, stt, system, tap, vxlan]
manager_options : 
next_cfg : 377
other_config : {doca-init=“true”, hw-offload=“true”}
ovs_version : “3.0.0-0056-25.04-based-3.3.5”
ssl : 
statistics : {}
system_type : ubuntu
system_version : “22.04”
root@localhost:/opt/mellanox/doca/applications# ovs-vsctl show
a0c32fa2-e289-4a0f-bbf5-627e64cbbba1
Bridge br2
datapath_type: netdev
Port pf0hpf
Interface pf0hpf
type: dpdk
options: {n_rxq=“32”, n_txq=“32”}
Port en3f0pf0sf5
Interface en3f0pf0sf5
type: dpdk
options: {n_rxq=“32”, n_txq=“32”}
Port br2
Interface br2
type: internal
Bridge br1
datapath_type: netdev
Port en3f0pf0sf4
Interface en3f0pf0sf4
type: dpdk
options: {n_rxq=“32”, n_txq=“32”}
Port br1
Interface br1
type: internal
Port p0
Interface p0
type: dpdk
options: {n_rxq=“32”, n_txq=“32”}
ovs_version: “3.0.0-0056-25.04-based-3.3.5”

不好意思,我想问您运行doca应用程序的问题,您运行DOCA应用程序绑定的dpdk驱动是vfio-pci还是mlx5_core?这是否会影响doca程序的正常运行?我在运行程序时遇到了程序并没有将输入数据转发给应用rss队列处理而是由linux协议栈处理的问题。
请问您对这方面有了解吗?

我们可以交流一下,你运行的是哪个DOCA APP?使用到了SF吗?据说是SF的性能有限导致了我遇到的问题,但是这个说法也没有被证实,所以我想看看你的SF的极限包率可以到多少。至于驱动,你可以看看下面的结果。

[root@localhost ~]# dpdk-devbind.py -s

Network devices using kernel driver
===================================
0000:1a:00.0 'Ethernet Connection X722 for 10GbE SFP+ 37d0' if=eno1 drv=i40e unused=vfio-pci,uio_pci_generic 
0000:1a:00.1 'Ethernet Connection X722 for 10GbE SFP+ 37d0' if=eno2 drv=i40e unused=vfio-pci,uio_pci_generic 
0000:1a:00.2 'Ethernet Connection X722 for 1GbE 37d1' if=eno3 drv=i40e unused=vfio-pci,uio_pci_generic 
0000:1a:00.3 'Ethernet Connection X722 for 1GbE 37d1' if=eno4 drv=i40e unused=vfio-pci,uio_pci_generic 
0000:3b:00.0 'Device a2dc' if=ens1f0np0 drv=mlx5_core unused=vfio-pci,uio_pci_generic *Active*
0000:3b:00.1 'Device a2dc' if=ens1f1np1 drv=mlx5_core unused=vfio-pci,uio_pci_generic *Active*
0000:5e:00.0 'MT27700 Family [ConnectX-4] 1013' if=ens3f0np0 drv=mlx5_core unused=vfio-pci,uio_pci_generic 
0000:5e:00.1 'MT27700 Family [ConnectX-4] 1013' if=ens3f1np1 drv=mlx5_core unused=vfio-pci,uio_pci_generic 
0000:86:00.0 'I350 Gigabit Network Connection 1521' if=ens4f0 drv=igb unused=vfio-pci,uio_pci_generic 
0000:86:00.1 'I350 Gigabit Network Connection 1521' if=ens4f1 drv=igb unused=vfio-pci,uio_pci_generic 
0000:86:00.2 'I350 Gigabit Network Connection 1521' if=ens4f2 drv=igb unused=vfio-pci,uio_pci_generic 
0000:86:00.3 'I350 Gigabit Network Connection 1521' if=ens4f3 drv=igb unused=vfio-pci,uio_pci_generic 
0000:af:00.0 'NetXtreme BCM5719 Gigabit Ethernet PCIe 1657' if=eno5 drv=tg3 unused=vfio-pci,uio_pci_generic *Active*
0000:af:00.1 'NetXtreme BCM5719 Gigabit Ethernet PCIe 1657' if=eno6 drv=tg3 unused=vfio-pci,uio_pci_generic 
0000:af:00.2 'NetXtreme BCM5719 Gigabit Ethernet PCIe 1657' if=eno7 drv=tg3 unused=vfio-pci,uio_pci_generic 
0000:af:00.3 'NetXtreme BCM5719 Gigabit Ethernet PCIe 1657' if=eno8 drv=tg3 unused=vfio-pci,uio_pci_generic 

谢谢您的回复,我是在BF2上运行的IPsec Security Gateway应用,但是并没有用到sf,抱歉不能帮您解决问题,因为我目前的学习阶段还因为运行程序的问题没有进入到测试速率这一层面。
如果您方便的话,能否在您的环境试一下是否可以在运行IPsec Security Gateway应用后,在/opt/mellanox/doca/applications/ipsec_security_gw/ipsec_security_gw_config.json中的config字段esp-header-offload为“both”和“none”的两种情况下,是否数据都能被处理呢?感谢!

ok,有空我会测试下IPsec Security Gateway,你能把你参考的官方文档链接发出来吗?

好的,链接是 IPsec Security Gateway - NVIDIA Docs

你确定你没有使用SF吗?我看文档中使用了SF,是不是网桥配置的问题,你可以发一下网桥的配置吗?使用ovs-vsctl show

root@localhost:/opt/mellanox/dpdk/bin# ovs-vsctl show
285f3b60-02b8-4b97-a946-a417dc838989
Bridge ovsbr2
Port ovsbr2
Interface ovsbr2
type: internal
Port p1
Interface p1
Bridge ovsbr1
Port ovsbr1
Interface ovsbr1
type: internal
Port p0
Interface p0
ovs_version: “2.10.0-0056-25.01-based-3.3.4”

我应该是没有主动设置过SF的,可能我对这个概念的理解有误?


根据这个结构图,要求新建一个SF并且和pfhpf在同一个网桥里,你的网桥配置中似乎没有做到这一点。你可以参考Scalable Function (SFs) - NVIDIA Docs 创建一个SF并新建一个网桥把sf和pf0hpf加入进去。

谢谢,您的这个回复给了我很大帮助,我之前还没有注意到ovs在这个程序中的参与。但是我在创建拓扑过程中发现,我无法在arm里找到pf0hpf,这是怎么一回事?非常抱歉,我对这部分的原理不是很明白。
补充:我在设置启用了SF支持后,能够ip a看到出现了pf0hpf,问题应该解决了!

我按照您建议的进行了sf的创建与部署,最终ovs-vsctl输出为:

285f3b60-02b8-4b97-a946-a417dc838989
Bridge ovsbr2
Port ovsbr2
Interface ovsbr2
type: internal
Port p1
Interface p1
Bridge ovsbr1
Port ovsbr1
Interface ovsbr1
type: internal
Port p0
Interface p0
Bridge sf_bridge1
Port sf_bridge1
Interface sf_bridge1
type: internal
Port en3f0pf0sf4
Interface en3f0pf0sf4
Port pf0hpf
Interface pf0hpf
ovs_version: “2.10.0-0056-25.01-based-3.3.4”

于是我再次执行程序,但发现程序与之前的表现并没有区别,依然会在esp-header-offload为none的情况下,正常回应发送到p0的数据,并且doca应用程序中检测到rss队列数据包的调试输出语句也没有执行。
而再次查看ovs-vsctl,会发现sf4接口下多了一个error提醒“could not open network device en3f0pf0sf4 (No such device)”:

Bridge sf_bridge1
Port sf_bridge1
Interface sf_bridge1
type: internal
Port en3f0pf0sf4
Interface en3f0pf0sf4
error: “could not open network device en3f0pf0sf4 (No such device)”
Port pf0hpf
Interface pf0hpf

这是因为什么?
请问您方便在您的设备上执行该IPsec Security Gateway程序吗?其表现是否与我的有所区别呢?再次打扰您非常抱歉!

你可以用mlnx-sf -a show查看sf的情况。此外,你使用的调试语句是用的什么语句,你的-l设置的数值有正确设置吗?不好意思我现在没有可用的环境来运行程序

我设置的-l数值为70,也就是trace也可以看到,优先级上来说是能看到我使用的调试语句的,而且在进入main函数中时以及部分显示内核情况的语句也打印出来了,但是到core接收rss数据时,却没有输出,应该是并没执行到那里。
执行mlnx-sf -a show没有输出,这正常吗?

你有把TRC改成DBG试过吗,老实说我没有用过TRC来输出日志。我看了一下代码,我也觉得那部分语句应该是要执行到的。也行你可以用gdb调试一下看看代码进入了哪个分支。
执行mlnx-sf -a show没有输出说明没有检测到SF,你可能要重新配置SF,但是我觉得SF的问题和你目前遇到的问题无关,在这个示例中SF应该是让DPU与host通信的,你好像还没涉及到这部分

想问一下您有跑过有匹配数据包以及操作修改报文的示例程序吗?我的目标是开发一个拆包打标的程序,所以是想找一个有类似操作的程序进行学习,不知道您有类似经验吗?

你可以看看NAT的代码,其中包括匹配ip和修改ip的操作,应该符合你的要求