OVS-DPDK网关双网卡性能损耗问题分析

场景构造:

node1 (10 pods) → gate_way → node2

网关配置:

br-tun桥对应隧道,br-ext桥对应外部网络。

复现过程:

node1节点建10个pods,并行打流,通过tcpreplay方式,流量经过网关节点 直接到 node2 服务器

发送端提供了约400W pps的发包能力,此时后端实际收包约为200W 不到,和之前测的单卡场景相差约100W左右,性能大大降低。

问题分析:

  • 热点函数分析:

通过perf 分析,和正常单网卡场景函数热点对比,发现dp_packet_batch_clone的cpu资源消耗异常

  • 调用栈以及代码分析:

 可以看出锁定在了dp_execute_output_action函数,此函数对应最终的output action

 odp_execute_actions函数中last_action决定最终是否走dp_packet_batch_clone分支。

对于datapath中的一条规则,如果当前action是最后一个动作,则不会有clone操作,反之则会有。所以推测,对于本场景,output action 应该不止是转发到dpdk_external_port,后面应该还有别的动作

  • 规则分析

 

 可以看出,做完vlan封装后,转发到了两个端口上。

2口对应dpdk_external_port,1口对于br-ext桥上的LOCAL_PORT

所以转发到dpdk_external_port后,还有另外一个动作,即转发到br-ext口上,符合上述推断。

  • 规则生成分析

对于为何同时转发到dpdk_external_port和br-ext上,需要进一步分析规则是如何生成的

对应关键函数如下:

流量到到br-ext桥上后,走的normal规则,上面函数会对非入口(此处对应localnet的pacth口)的所有端口进行判断,确定是否构造output action,从代码跟踪结果看,当端口为br-ext和dpdk_external_port时,都会构造output action。

对于单卡场景,由于外部子网vlan为151,br-tun上的br-tun口配的152,所以xbundle_includes_vlan(xbundle, xvlan)函数返回false,所以不会构造到brtun口的output action,单卡场景规则如下:

可以看出只转到了dpdk_tun_port。

解决方案(2种方法):

xlate_normal_flood函数中有个判断逻辑决定是否构建action,即xbundle→floodable 通过命令:ovs-ofctl mod-port br-ext br-ext no-flood 可以让xbundle→floodable 为false,从而不构建action。

另外,也可以在br-ext口上配一个不等与外部子网vlanid的tag,如下:

ovs-vsctl set port br-ext tag=199 //151 != 199 ,xbundle_includes_vlan(xbundle, xvlan) 为false

此时再查看dpcls规则:

可以看出只转到了dpdk_external_port,此时再看性能数据,数据恢复正常,高了100W左右

补充分析:

ovs刚重启时候,会去用flood学习端口信息,所以action会发到br-ext口上,当ovs老化线程(revalidators) 下次开始老化后,由于已经学到了端口信息,所以不再flood了,此时action会被更新 ,不再发往br-ext口上。对于FT2000平台,持续打流场景,老化时间约为几分钟。

所以双网卡性能损耗问题只会出现在下一次老化之前,老化后恢复正常,目前看无需做特殊处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值