记录下之前研究过的OVS-Kernel和OVS-DPDK在Mellanox SmartNIC上的聚合卸载功能
环境
OVS-Kernel
参考页面:https://docs.nvidia.com/networking/display/ofed510660/ovs+offload+using+asap%C2%B2+direct,OVS-Kernel Hardware Offloads SR-IOV VF LAG 章节
支持offload的聚合模式
Active-Backup
XOR
LACP
配置步骤
1.OVS-Kernel启动参数
ovs-vsctl set Open_vSwitch . other_config:hw-offload=true
//硬件流表老化时间20s
ovs-vsctl set Open_vSwitch . other_config:hwoff-max-idle=20000
//查询流表是否卸载到了网卡
//ovs-appctl dpctl/dump-flows system@ovs-system type=offloaded
2.创建Linux Bond并将pf加入其中
//加载聚合口模块
modprobe bonding
//创建bond_lz1聚合口
echo +bond_lz1 > /sys/class/net/bonding_masters
//修改聚合模式
echo 2 > /sys/class/net/bond_lz1/bonding/mode
//修改xor聚合tx hash(layer3+4)
echo 1 > /sys/class/net/bond_lz1/bonding/xmit_hash_policy
//修改链路状态检测时间
echo 100 > /sys/class/net/bond_lz1/bonding/miimon
//添加bond_lz1聚合口的成员网口:
echo +enp4s0f0 > /sys/class/net/bond_lz1/bonding/slaves
echo +enp4s0f1 > /sys/class/net/bond_lz1/bonding/slaves
//ifconfig up聚合口及其成员网口
3.将Bond和vf rep口加入ovs br,并将其up
ovs-vsctl add-port ovs-sriov bond0
ovs-vsctl add-port ovs-sriov enp4s0f0_0
ovs-vsctl add-port ovs-sriov enp4s0f1_0
ifconfig...up
验证结果
1.ab主备聚合功能正常
2.xor静态聚合,二层和三+四层hash正常(其余hash未测)
3.lacp聚合,二层和三+四层hash正常(其余hash未测)
4.以上聚合方式成员网口down后,流量均可从另一成员网口发出(链路冗余功能正常)
其他:无法像Linux bond一样直接剔除成员网口
注意
1.只有vf口上的流量可卸载,ovs br上其他口的流量,无法卸载
2.所有需要卸载的vf口,都需要将其rep口加入ovs br
OVS-DPDK
参考页面:https://docs.nvidia.com/networking/display/ofed510660/ovs+offload+using+asap%C2%B2+direct,OVS-DPDK Hardware Offloads SR-IOV VF LAG 章节
支持offload的聚合模式
无特别说明,推测和OVS-Kernel offload相同:
Active-Backup
XOR
LACP
配置步骤
1.开启sr-iov
mlxconfig -d set SRIOV_EN=1
2.开启vf口
echo 1 > /sys/class/net/ens4f0/device/sriov_numvfs
3.解绑vf驱动
echo 0000:5e:00.2 > /sys/bus/pci/drivers/mlx5_core/unbind
4.修改为eswitch模式(两个pf都需要配置)
devlink dev eswitch set pci/0000:5e:00.0 mode switchdev
devlink dev eswitch set pci/0000:5e:00.1 mode switchdev
5.重绑vf驱动
echo 0000:5e:00.2 > /sys/bus/pci/drivers/mlx5_core/bind
6.创建内核聚合口
modprobe bonding mode= <xxx>
7.down掉所有pf和vf口
ip link set <pf/vf> down
8.将2个pf口加入bond
ip link set <pf> master bond0
9.创建ovs-dpdk br
ovs-vsctl add-br br-phy -- set bridge br-phy datapath_type=netdev
10.添加pci地址在前的pf口到 ovs-dpdk br
ovs-vsctl add-port br0 p0 -- set Interface p0 type=dpdk options:dpdk-devargs=0000:88:00.0
11.添加rep口(有几个vf需要通信就添加几个)到ovs-dpdk br
ovs-vsctl add-port br0 rep0 -- set Interface rep0 type=dpdk options:dpdk-devargs=0000:88:00.0,representor=[0]
验证结果
XOR和LACP tx hash与所配置的Linux bond tx hash并不相同,相关资料:
https://enterprise-support.nvidia.com/s/article/Debugging-VF-LAG-issues-with-ASAP2
vf口的tx queue被做了map,关联了不同的pf口,通过此来实现tx hash,与OVS-Kernel场景下的卸载实现不同
注意
1.只有vf口上的流量可卸载,ovs br上其他口的流量,无法卸载
2.第二个pci地址的pf口无需加入ovs br,Mellanox能自行感知到
3.操作流程一不对将无法恢复(内核mlx驱动会有些许错误打出),只能重启设备恢复
注意
Mellanox bond offload只可支持卸载Linux bond,对于OVS bond、Linux team以及DPDK bond均不支持卸载