场景构造:
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平台,持续打流场景,老化时间约为几分钟。
所以双网卡性能损耗问题只会出现在下一次老化之前,老化后恢复正常,目前看无需做特殊处理。