可参考https://kubeovn.github.io/docs/stable/advance/offload-mellanox/

环境

操作系统:

uname -a
Linux  5.4.0-187-generic #207-Ubuntu SMP Mon Jun 10 08:16:10 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux 

Mellanox网卡:

ethtool -i ens6np0
driver: mlx5_core
version: 23.10-2.1.3
firmware-version: 20.39.3004 (MT_0000000222)

openvswitch:

 ovs-vswitchd --version
ovs-vswitchd (Open vSwitch) 2.15.8

配置SRIOV

具体见https://blog.csdn.net/aashuii/article/details/140313972
在本例中,为了操作方便启用了1个VF,有的网卡启用SRIOV后会默认启动多个VF,可以设置为一个:

 mlxconfig -d /dev/mst/mt4123_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=1

结果确认:

rdma link
link mlx5_0/1 state DOWN physical_state DISABLED 
link mlx5_0/2 state ACTIVE physical_state LINK_UP netdev ens6np0 
link mlx5_1/1 state ACTIVE physical_state LINK_UP netdev ens6np0v0

可以看出PF的接口是ens6np0 ,VF的接口是ens6np0v0

安装openvswitch

可以通过apt-get install openvswitch-switch(systemctl status openvswitch-switch)安装,但版本较低(2.9),所以这里选择手动安装。

下载解压源码:

安装依赖:

apt-get install build-essential linux-headers-$(uname -r) 
apt-get install graphviz automake bzip2 debhelper dh-autoreconf procps python-all 
apt-get install  python-six dkms module-assistant 
apt-get install  libc6-dev netbase  python-argparse  uuid-runtime
apt-get install python-pip libtool autoconf  

编译安装:

./boot
./configure --with-linux=/lib/modules/$(uname -r)/build
make
make install
make modules_install

启动:

utilities/ovs-ctl start --system-id=random

注意1:这种方式启动后的日志默认路径不是/var/log/openvswitch,而是/usr/local/var/log/openvswitch/
注意2:这种方式启动的没有systemctl守护,重启后可能需要手动启动
在这里插入图片描述
确认启动成功:
在这里插入图片描述

配置卸载

修改网卡模式:
先找到VF对应的pci地址,可在/sys/class/net下查看

#需要把每一个VF的pci地址卸载后才能更改
echo 0000:af:00.1 > /sys/bus/pci/drivers/mlx5_core/unbind
#PF接口ens6np0 
echo switchdev > /sys/class/net/ens6np0/compat/devlink/mode
echo 0000:af:00.1 > /sys/bus/pci/drivers/mlx5_core/bind
#VF接口ens6np0v0 
ifconfig ens6np0v0 10.50.0.1/24 up

配置ovs:

ovs-vsctl add-br ovs-br
#192.168.1.3是本地PF接口的IP
ovs-vsctl add-port ovs-br vx16 -- set interface vx16 type=vxlan options:local_ip=192.168.1.1 options:remote_ip=192.168.1.3 options:key=16
ovs-vsctl add-port ovs-br eth0 

配置完后使用ovs-vsctl show确认:
在这里插入图片描述
确认vxlan的tc规则tc -s qdisc show dev vxlan_sys_4789:
在这里插入图片描述

配置硬件卸载:

#可使用ethtool -k ens6np0 | grep tc-offload确认
ethtool -K ens6np0 hw-tc-offload on 

查看是否配置成功:

   ethtool -k ens6np0 | grep hw-tc-offload

这一步应该生成vf rep,用rdma link确认:
在这里插入图片描述
继续配置:

ifconfig ens6np0v0 10.50.0.1/24 up
ifconfig eth0 up
ovs-vsctl set Open_vSwitch . other_config:hw-offload=true  

可使用使用ovs-vsctl get Open_vSwitch . other_config:hw-offload确认

验证

服务端执行:ib_send_bw -d mlx5_1 -x 3 --report_gbits
客户端执行:ib_send_bw -d mlx5_1 -x 3 --report_gbits 10.50.0.1
注:-x后面是gid,可根据show_gids查看,选择RoCEv2
在这里插入图片描述
这一步通了,并不能证明卸载成功,要确定走的是硬件转发还是软件转发,一般来说如果带宽特别低,可能就是软件转发,可以在vf rep(本例中为eth0)抓包查看,如果看到很多tcp和roce报文,那就是卸载失败了,正常应该是:
在这里插入图片描述
还可以在网卡上抓包确认:使用ib dump或者tcpdump(见https://blog.csdn.net/aashuii/article/details/144580466)

卸载失败可以查看流表确认:

#卸载失败的
ovs-appctl dpctl/dump-flows type=non-offloaded
#卸载成功的
ovs-appctl dpctl/dump-flows type=offloaded

在这里插入图片描述

另外可以开启debug级别日志看是否有提示:

ovs-appctl vlog/set netdev_offload_tc:dbg
ovs-appctl vlog/set dpif_netlink:dbg

问题总结

make modules_install提示ssl相关c和h文件找不到

At main.c:167:

  • SSL error:02001002:system library:fopen:No such file or directory: …/crypto/bio/bss_file.c:69
  • SSL error:2006D080:BIO routines:BIO_new_file:no such file: …/crypto/bio/bss_file.c:76
    sign-file: certs/signing_key.pem: No such file or directory
    INSTALL /home/lz/openvswitch-2.15.8/datapath/linux/vport-geneve.ko

根据https://blog.51cto.com/SpaceVision/5071551执行以下操作后重新make

cd /lib/modules/$(uname -r)/build/certs

sudo tee x509.genkey > /dev/null << 'EOF'
[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts
[ req_distinguished_name ]
CN = Modules
[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
EOF

sudo openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pem

db.sock路径找不到

ovs-vsctl: unix:/var/run/openvswitch/db.sock: database connection failed (No such file or directory)
ln -s /usr/local/var/run/openvswitch/db.sock /var/run/openvswitch/db.sock

多服务器多卡场景

按照上文的配置,多服务器上ovs之间通过vxlan互联会形成环路,进而形成广播风暴,或者其他报文复制的风暴,需要自己写流表避免vxlan环路,即vf-rep(eth0)和vxlan之间可以互转,vxlan和vxlan之间不可以互转:

#配置到多个服务器上多个网卡的vxlan
#外层IP头中的dscp使用内层的值,需要配置options:tos=inherit,
#这种情况下配置PF的traffic_class是不管用的
ovs-vsctl add-port ovs-br0 vx1 -- set interface vx1 type=vxlan options:local_ip=192.168.20.11 options:remote_ip=192.168.128.2 options:key=99 options:tos=inherit
ovs-vsctl add-port ovs-br0 vx2 -- set interface vx2 type=vxlan options:local_ip=192.168.20.11 options:remote_ip=192.168.21.11 options:key=1 options:tos=inherit

#eth过来的报文都到表1处理
ovs-ofctl add-flow ovs-br0 "table=0,priority=1,in_port=eth0 actions=resubmit(,1)"
#vxlan过来的报文都到表2处理
ovs-ofctl add-flow ovs-br0 "table=0,priority=1,in_port=vx1 actions=resubmit(,2)" 
ovs-ofctl add-flow ovs-br0 "table=0,priority=1,in_port=vx2 actions=resubmit(,2)"
ovs-ofctl add-flow ovs-br0 "table=0,priority=0,actions=drop"
#eth出来的广播到表21,单播到表20
ovs-ofctl add-flow ovs-br0 "table=1,priority=0,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00,actions=resubmit(,20)"
ovs-ofctl add-flow ovs-br0 "table=1,priority=0,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00,actions=resubmit(,21)"
#表21处理eth的广播和没有fdb匹配的其他报文 转发到vx1和vx2
ovs-ofctl add-flow ovs-br0 "table=21,priority=0,actions=output:vx1,output:vx2"
#表2处理vx的报文,arp学习结果写入表20(某个mac是从某个vx学到的,要从这个vx转发出去),然后转发到eth
ovs-ofctl add-flow ovs-br0 "table=2,priority=0,actions=learn(table=20,hard_timeout=3000,priority=1,NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:NXM_OF_IN_PORT[]), output:eth0"
#表20 处理eth的单播 
ovs-ofctl add-flow ovs-br0 "table=20,priority=0,actions=drop"

说明:
如果VF接入容器,如果表20中mac导入tunnel已经的表项已经老化,但容器arp没有老化,那么主机上这个报文就会走入20的默认转发条目:“table=20,priority=0,actions=drop”
然后被丢弃,可以使用 “table=20,priority=0,actions=resubmit(,21)” 防止丢弃,但这样会导致单播条目走入表21,被复制到多个vxlan中

结果:
一个服务器上的两个网卡之间建立vxlan,卸载不成功
一个网卡需要对应一个网桥,不然tunnel卸载不成功

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐