QSG:使用Mellanox ASAP2增强型SR-IOV(VF-LAG)实现高可用性
创建于2020年4月16日,作者Amir Zeidner。本指南介绍如何利用Mellanox ASAP2技术将链路聚合(LAG)功能卸载到智能网卡硬件,从而为虚拟化工作负载提供高可用性。内容包括解决方案概述、逻辑设计、主机配置与部署步骤。
文档目录
Created on Apr 16, 2020 by Amir Zeidner
引言
目前,使用SR-IOV VF(虚拟功能)端口连接虚拟化工作负载时,缺乏对链路聚合的支持。 Mellanox ASAP2技术通过将LAG(链路聚合组)功能卸载到智能网卡(SmartNIC)硬件,扩展了传统SR-IOV的能力。这意味着虚拟机可以挂载单个VF,并由网卡级别的LAG提供支持。 本指南将重点介绍卸载LAG功能的优势,并引导您在独立Linux服务器上进行配置和评估。
参考资料
解决方案概述
在虚拟环境中实现LAG有几种选择,具体取决于系统配置和性能需求:
| 方案 | 说明 |
|---|---|
| VM通过虚拟接口(virtio)连接到主机LAG。此方案适用于不需要高性能网络的负载和应用。 | 图1:![]() |
| SR-IOV是网络密集型应用的默认选择。此时,链路聚合在VM内部执行(VM感知LAG),仅可实现HA模式。 | 图2:![]() |
| SR-IOV switchdev模式和ASAP²(加速交换与包处理®)是增强型SR-IOV技术,将网络处理从主机和VM卸载到网卡硬件。绑定功能现在卸载到网卡硬件。单个虚拟功能由两个物理绑定端口支持。 | 图3:![]() |
解决方案逻辑设计
参考图4,Hypervisor中的两个网卡PF网络接口被绑定。绑定模式会反映到同一网卡的所有VF上。例如:如果BOND配置为LACP(链路聚合控制协议)模式,则所有VF LAG接口将共享相同的配置。
要启用VF-LAG,网卡应处于SR-IOV switchdev模式。与传统SR-IOV模式不同,switchdev模式需要控制平面来配置VF的转发行为。本文档使用OVS实现此目的。更多详情请参阅OVS卸载文档。
图4:
主机配置与前提条件
- BIOS:启用VT-D和SR-IOV
- OpenVswitch >= 2.12
- 操作系统 >= RHEL 7.7
- 内核 >= 4.10
主机部署与配置
设置Mellanox固件以支持SR-IOV
首先安装mstflint工具:
yum install mstflint -y
提取PF的PCI总线槽位号:
lspci | grep -i mel | grep -v Virtual
61:00.0 Ethernet controller: Mellanox Technologies MT28800 Family [ConnectX-5 Ex]
61:00.1 Ethernet controller: Mellanox Technologies MT28800 Family [ConnectX-5 Ex]
使用上一步获取的PCI槽位号设置固件以启用SR-IOV并指定VF数量:
## 启用SR-IOV并设置所需VF数量(本例启用4个VF)##
mstconfig -d <PF_PCI_BUS_slot_number> set SRIOV_EN=1 NUM_OF_VFS=4
配置Linux绑定
配置BOND接口。 本例演示BOND LACP配置:
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
ONBOOT=yes
HOTPLUG=no
NM_CONTROLLED=no
PEERDNS=no
BOOTPROTO=none
BONDING_OPTS="mode=4 miimon=100 lacp_rate=1"
BOOTPROTO=static
EOF
注意: 要了解更多关于绑定模式的信息,请参考: https://www.cloudibee.com/network-bonding-modes/ 支持的模式为1、2、4。
配置从接口
将 <first_interface_name> 和 <second_interface_name> 替换为相应的PF绑定从接口名称。
##配置第一个从接口##
sed -i 's/\(ONBOOT=\)no/\1yes/g' /etc/sysconfig/network-scripts/ifcfg-<First_PF_interface_name>
sed -i 's/\(BOOTPROTO=\)dhcp/\1none/g' /etc/sysconfig/network-scripts/ifcfg-<First_PF_interface_name>
cat << EOF >> /etc/sysconfig/network-scripts/ifcfg-<First_PF_interface_name>
MASTER=bond0
SLAVE=yes
EOF
##配置第二个从接口##
sed -i 's/\(ONBOOT=\)no/\1yes/g' /etc/sysconfig/network-scripts/ifcfg-<Second_PF_interface_name>
sed -i 's/\(BOOTPROTO=\)dhcp/\1none/g' /etc/sysconfig/network-scripts/ifcfg-<Second_PF_interface_name>
cat << EOF >> /etc/sysconfig/network-scripts/ifcfg-<Second_PF_interface_name>
MASTER=bond0
SLAVE=yes
EOF
重启网络服务
systemctl restart network.service
启用ASAP2 VF-LAG功能
本例每个PF使用2个VF(可以配置更多)。 提取PF的PCI总线槽位号:
lspci | grep -i mel | grep -v Virtual
QSG: 使用Mellanox ASAP2增强型SR-IOV (VF-LAG)实现高可用性
启用每个PF绑定从接口的switchdev模式
## 刷新iptables规则并为每个PF启用TC卸载 ##
iptables -F
ethtool -K <First_PF_interface_name> hw-tc-offload on
ethtool -K <Second_PF_interface_name> hw-tc-offload on
## 本例中每个PF定义2个VF ##
echo 0 > /sys/class/net/<First_PF_interface_name>/device/sriov_numvfs
echo 0 > /sys/class/net/<Second_PF_interface_name>/device/sriov_numvfs
echo 2 > /sys/class/net/<Second_PF_interface_name>/device/sriov_numvfs
echo 2 > /sys/class/net/<First_PF_interface_name>/device/sriov_numvfs
### 解绑Mellanox VF的内核驱动 ##
VFS_PCI=($(lspci | grep "Mellanox" | grep "Virtual" | cut -d " " -f 1));
for i in ${VFS_PCI[@]};
do
echo "unbinding VF $i";
echo "0000:${i}" >> /sys/bus/pci/drivers/mlx5_core/unbind;
done
### 通过指定PCI插槽地址号将PF接口设置为switchdev模式 ###
devlink dev eswitch set pci/0000:61:00.0 mode switchdev
devlink dev eswitch set pci/0000:61:00.1 mode switchdev
启用switchdev模式后,新的代表端口将出现在Linux网桥中
现在可以发现代表端口映射。
首先从本部分下载附带的map_rep.py脚本,并按如下说明运行:
pip install tabulate
python map_rep.py --port <First_PF_interface_name>
## 示例输出 ##
VF NUMBER REPRESENTOR PORT VF PORT VF PCI PF NAME MACHINE NAME MACHINE UUID
----------- ------------------ --------- ------------ --------- -------------------------- --------------
0 ens2f0_0 0000:61:00.2 ens2f0 clx-host-038-01-CentOS-7.7 2
1 ens2f0_1 0000:61:00.3 ens2f0 clx-host-038-01-CentOS-7.7 2
Openvswitch设置
将所需的代表端口添加到OpenVswitch网桥,这些端口代表指定的VF:
## 启动代表端口 ##
ifconfig <representor_port1_name> up
## 创建包含BOND和代表端口的OVS网桥 ##
systemctl start openvswitch
ovs-vsctl add-br ovs-sriov
ovs-vsctl add-port ovs-sriov <representor_port1_name>
ovs-vsctl add-port ovs-sriov bond0
## 启用OVS硬件卸载并重启 ##
ovs-vsctl set Open_vSwitch . other_config:hw-offload=true
systemctl restart openvswitch
部署验证
测试部署(图5)概述:
图5

-
首先,使用基于VF PCI插槽号的SRIOV附加方式,启动一个带有VF接口的客户虚拟机。 以下是VF PCI插槽号为0000:61:01.2的SRIOV接口附加的Virsh XML部分:
<interface type='hostdev' managed='yes'> <mac address='6a:66:2d:48:92:c3'/> <source> <address type='pci' domain='0x0000' bus='0x61' slot='0x01' function='0x2'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x11' function='0x0'/> </interface> -
在客户虚拟机中为VF接口设置IP地址1.1.1.1。
-
为连接到L2交换机的Iperf客户端接口设置IP地址1.1.1.2。
-
通过发送ICMP请求,确保Iperf客户端与客户虚拟机之间的连通性。
-
在客户虚拟机上启动iperf服务器:
iperf3 -s -
在Iperf客户端服务器上启动iperf客户端:
iperf3 -c 1.1.1.1 -P 10 -
验证两个绑定从接口上都有数据包接收和发送。 在客户虚拟机管理程序命令行中运行:
watch -d -n1 "ethtool -S <First_PF_interface_name> | grep packets | grep phy" watch -d -n1 "ethtool -S <Second_PF_interface_name> | grep packets | grep phy" ## 输出应如下所示 ## tx_packets_phy: 135555012 rx_packets_phy: 1487683 -
使其中一个绑定链路失效,重复步骤7。您将观察到数据包仅通过单个绑定从接口接收和发送。
拆除VF-LAG BOND
如果用户想要拆除VF-LAG BOND,务必遵循以下顺序:
-
首先从虚拟机中拆除VF。
-
按如下方式解绑VF驱动:
VFS_PCI=($(lspci | grep "Mellanox" | grep "Virtual" | cut -d " " -f 1)); for i in ${VFS_PCI[@]}; do echo "unbinding VF $i"; echo "0000:${i}" >> /sys/bus/pci/drivers/mlx5_core/unbind; done -
撤销本文中描述的构建VF-LAG BOND的步骤。
关于作者
![]() |
Amir Zeidner 多年来,Amir主要在电信领域担任解决方案架构师,领导先进解决方案以满足5G、NFV和SDN网络基础设施需求。Amir在数据平面加速技术(如加速交换和网络处理(ASAP²)和DPDK)方面的专业知识,加上对开源云基础设施的深入了解,使他能够在整个电信领域推广和交付独特的端到端NVIDIA网络解决方案。 |
相关文档
相关页面
- How-to: Configure VMware NSX-T for high performance networks on VMware NFV Platform with Mellanox supported adapters.
- QSG: NVIDIA BlueField DPU with OVS Hardware Offload.
- RDG: RoCE accelerated K8s cluster deployment for ML and HPC workloads.
- RDG: RoCE accelerated Apache Spark 2.2 cluster deployment.
- RDG: RoCE accelerated vSphere 6.7 cluster deployment for ML and HPC workloads.
- RDG for VMware NSX-V Hardware VTEPs in High-Availability Mode on Spectrum 交换机 Running Cumulus Linux
- RDG: VMware NSX-V hardware VTEP on Spectrum switches running Mellanox Onyx.
- HowTo Update Firmware for NVIDIA ConnectX-5 or ConnectX-6 Adapter on VMware ESXi 6.5 and above
- HowTo Change Port Type of NVIDIA ConnectX VPI 网卡 on VMware ESXi 6.x and above
- HowTo Upgrade NVIDIA ConnectX Driver on VMware ESXi 6.7 and 7.0 and above
- HowTo Configure NVIDIA Network Device in VMDirectPath IO Passthrough Mode on VMware ESXi 6.x
- RDG: Red Hat OpenStack Platform 13 with NVIDIA Network OVS Offload.
- QSG for Configuring TRex in a few steps using Nvidia ConnectX adapters





