写这个文章首要是由于最近收了一张洋垃圾ConnectX-6 Dx网卡,看文档的时分突然发现这个东西支撑一个叫ASAP2的功用,说是网卡的ASIC上面有个embedded switch(下面简称e-switch)能够加快vm的流量转发。听上去就很厉害,所以我试着装备了一下。成果一折腾便是一整个月哈哈,今日回想了一下觉得还挺有意思的,就写一篇文记录下来。

首先说点Disclaimer,本人不是网络工程师也不是专业运维,或许有些地方会说错,还请咱们纠正。另外便是既然你搜到了这个文章,应该也不会是新手小白,请直接看感兴趣的部分就行。

介绍

(上来就盗一张NV的图)

如安在Proxmox VE 8上装备运用Mellanox网卡的OVS Hardware Offload

e-switch offload的原理大概便是上面这个姿态,网卡经过发动SRIOV虚拟化生成VF(virtual function)分配给虚拟机,然后Host上面的openvswitch(下面简称OVS)或许Linux Bridge经过监听网桥上面的流量,把对应的flow规矩写到网卡的ASIC上面,接下来网卡硬件就能根据记下来规矩转发封包,不需要Host的网桥软件参加,完成硬件转发。而且由于转发是发生在ASIC上面,vf之间的转发速度上限最终会落到PCIE总线或许内存速度上(看cpu性能还有vm数量),而不是网络接口上。

给咱们看一张从Linux Bridge切换到e-switch之后的Server Load比照:

如安在Proxmox VE 8上装备运用Mellanox网卡的OVS Hardware Offload

我这台机首要负载是文件服务,能够看到运用了e-switch之后Server Load差不多减少了50%

装备流程

装置MLNX驱动 ==> 启用SRIOV ===> 装备PCI直通 ==> 装备SRIOV ==> 装备OVS ==> 保存终究装备

其实除了最终一步,都能在网络上找到教程或许相关的文档,我会把相应的链接贴到步骤的最终面

装置MLNX驱动

首先去Nvidia官网下载MLNX_EN驱动(Proxmox自带的驱动似乎不行,或许是我太菜):

network.nvidia.com/products/et…

挑选最新版,Debian 12,iso或许tgz看你喜欢,我挑选tgz

如安在Proxmox VE 8上装备运用Mellanox网卡的OVS Hardware Offload

在Proxmox的控制台下载驱动压缩包:

wget 'https://www.mellanox.com/downloads/ofed/MLNX_EN-23.10-1.1.9.0/mlnx-en-23.10-1.1.9.0-debian12.1-x86_64.tgz' # 记得把上面的链接换成最新的链接

记得把上面的链接换成最新的链接!

这儿插一句题外话,其实我这部机的proxmox 8.10用的是Ubuntu23.10的内核,可是由于系统依靠的关系,Ubuntu版驱动装不上。

解压缩:

tar -xf mlnx-en-23.10-1.1.9.0-debian12.1-x86_64.tgz # 同上,记得替换成最新的文件名

装置驱动:

cd mlnx-en-23.10-1.1.9.0-debian12.1-x86_64
./install --skip-distro-check # 越过distro检查,由于proxmox不是debian

(其实装mlnx-en而不是mlnx-ofed一个原因是proxmox上面装置ofed版本驱动会有依靠抵触,另一个原因是我自身只用ethernet)

这儿驱动就装置完成了,主张重启一次电脑

装备SRIOV

ConnectX这个系列网卡的SRIOV功用要在固件层面先打开

发动mst并检查网卡途径

mst start  # 发动mst
mst status # 检查网卡途径

如安在Proxmox VE 8上装备运用Mellanox网卡的OVS Hardware Offload

这儿咱们复制我高亮出来的网卡途径

检查固件SRIOV状况

mlxconfig -d /dev/mst/mt4125_pciconf0 q | grep -e SRIOV_EN -e NUM_OF_VFS

如安在Proxmox VE 8上装备运用Mellanox网卡的OVS Hardware Offload

SRIOV_EN是网卡SRIOV功用的状况,我这儿是true,便是已发动

NUM_OF_VFS是网卡最多支撑的VF数量,便是虚拟网卡的数量,这儿是16,便是最多支撑16个

发动固件SRIOV

假如查询出来的SRIOV_EN是false或许NUM_OF_VFS是0还是太小的数值的话:

mlxconfig -d /dev/mst/mt4125_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=4 # 改成你需要的vf数量

这儿要留意vf的数量是够用就好,不是越大越好。

到这儿发动SRIOV的部分就完成了,上面的这些固件改动需要电脑重启之后才干收效,没有改动的话也能够不重启

补白

装备固件的方法以NV的文档为准: enterprise-support.nvidia.com/s/article/H…

装备PCI Passthrough

确认主板已发动IOMMU

这儿以主板manual为准

启用kernel IOMMU参数

假如用的是默认的grub引导的话

vi /etc/default/grub
# 然后在 GRUB_CMDLINE_LINUX_DEFAULT 里边加上 intel_iommu=on iommu=pt
# 或许假如是amd渠道的话 amd_iommu=on iommu=pt 如下图
update-grub

如安在Proxmox VE 8上装备运用Mellanox网卡的OVS Hardware Offload

假如用的是systemd-boot引导的话(zfs装置是systemd引导)

vi /etc/kernel/cmdline
# 然后在最终面加上 intel_iommu=on iommu=pt
# 或许假如是amd渠道的话 amd_iommu=on iommu=pt 如下图
proxmox-boot-tool refresh

如安在Proxmox VE 8上装备运用Mellanox网卡的OVS Hardware Offload

启用vfio modules

vi /etc/modules
# 然后在最终面加上
# vfio
# vfio_iommu_type1
# vfio_pci
update-initramfs -u -k all

重启电脑并验证IOMMU功用

journalctl -k | grep -e DMAR -e IOMMU -e AMD-Vi

找一下出来的成果里边有没有这句话:

DMAR: IOMMU enabled

有的话这一步就完成了

补白

这儿以proxmox文档为准: pve.proxmox.com/pve-docs/pv…

装备SRIOV

找到你的网卡

ip link show

或许直接去proxmox的web ui看,这儿我的网卡叫 enp7s0f0np0

如安在Proxmox VE 8上装备运用Mellanox网卡的OVS Hardware Offload

切换网卡eswitch模式为 switchdev

echo switchdev > /sys/class/net/enp129s0f1/compat/devlink/mode

增加SRIOV VF:

这儿先增加两个vf

echo 2 > /sys/class/net/enp7s0f0np0/device/sriov_numvfs # enp7s0f0np0 替换成你的网卡

然后你就能看到新建出来两个vf和两个vf representor,见上图(有个vf被我屏蔽了)

enp7s0f0v0 enp7s0f0v1 是vf,留意结束是v0和v1。

enp7s0f0npf0vf0 enp7s0f0npf0vf1 是vf representor,留意结束是npf0vf0和npf0vf1,(当然中间不一定是pf0,也或许是pf1什么的,要看vf所属于的pf序号是几)

vf到时分能够分配给vm或许lxc用,vf representor是增加到linux bridge或许ovs里边代表vf用的,这儿要留意一点是sysfs的改动在电脑重启之后会被抹除,所以这儿咱们能够先配着持续配着玩一玩,在确认了最终的网络装备之后,咱们再编写详细的装备文件保存装备。

装备OVS

咱们能够先把一个vf分配给vm,在web ui上面操作就能够了

如安在Proxmox VE 8上装备运用Mellanox网卡的OVS Hardware Offload

接下来能够发动vm,Linux vm基本上是免驱的,自带mlx5_core module.

Windows vm需要去nv官网下载WinOF-2驱动: network.nvidia.com/products/ad…

vm发动之后咱们ping一下就会发现没有连上网,这是由于咱们还需要把vf representor增加到ovs里边:

创立OVS网桥并增加端口

ethtool -K enp7s0f0np0 hw-tc-offload on
ovs-vsctl set Open_vSwitch . other_config:hw-offload=true # 发动硬件卸载
systemctl restart openvswitch.service
ovs-vsctl add-br vmbr2
ovs-vsctl add-port vmbr2 enp7s0f0np0
ovs-vsctl add-port vmbr2 enp7s0f0npf0vf0
ovs-vsctl add-port vmbr2 enp7s0f0npf0vf1
ip link set dev enp7s0f0np0
ip link set dev enp7s0f0npf0vf0
ip link set dev enp7s0f0npf0vf1

这一步做完就会发现已经有网了,接下来能够验证一下hardware offload有没有运作

ovs-appctl dpctl/dump-flows type=offloaded

假如跟我一样看到一大堆东西出来便是一切正常了

如安在Proxmox VE 8上装备运用Mellanox网卡的OVS Hardware Offload

接下来咱们能够随便玩玩,想好接下来的固定装备要配什么。

补白

nv的官方文档: docs.nvidia.com/networking/…

openstack的ovs offload文档: docs.openstack.org/neutron/zed…

intel的switchdev脚本: edc.intel.com/content/www…

保存终究装备

上面咱们提到sysfs重启之后就会被清除,而proxmox开机的时分也会删除ovs-db,所以咱们现在还需要多一步来保存最终决议的装备

我这儿运用udev来坚持sriov的状况,用proxmox自带的ifupdown2来坚持ovs的装备

装备udev

留意咱们首先要取得网卡的mac,用你了解的方式就行不赘述

cat <<EOF > etc/udev/rules.d/99-sriov.rules
ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="mlx5_core", ATTR{address}=="08:c0:eb:32:98:11", ATTR{compat/devlink/mode}="switchdev"
ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="mlx5_core", ATTR{address}=="08:c0:eb:32:98:11", ATTR{device/sriov_numvfs}="2"
EOF

这儿第一句是修正网卡eswitch模式为switchdev,第二句是创立2个vf

留意文件名99-sriov.rules能够改成你喜欢的名字,还有网卡的mac地址要改成你的网卡的地址

装备ifupdown2

vi /etc/network/interfaces

这儿能够参阅我的装备:

auto enp7s0f0np0
iface enp7s0f0np0 inet manual
	ovs_type OVSPort
	ovs_bridge vmbr2
auto enp7s0f0npf0vf0
iface enp7s0f0npf0vf0 inet manual
	ovs_type OVSPort
	ovs_bridge vmbr2
auto enp7s0f0npf0vf1
iface enp7s0f0npf0vf1 inet manual
	ovs_type OVSPort
	ovs_bridge vmbr2
auto vmbr2
iface vmbr2 inet static
	address 192.168.1.101/24
	gateway 192.168.1.1
	ovs_type OVSBridge
	ovs_ports enp7s0f0np0 enp7s0f0npf0vf0 enp7s0f0npf0vf1
	pre-up /usr/bin/ovs-vsctl set Open_vSwitch . other_config:hw-offload=true
	pre-up /usr/bin/ovs-vsctl set Open_vSwitch . other_config:max-idle=30000
	pre-up /usr/bin/systemctl restart openvswitch-switch.service
	post-up /usr/sbin/ethtool -K enp7s0f0np0 hw-tc-offload on
	post-up /usr/sbin/ip link set enp7s0f0np0 vf 0 mac BA:DD:AD:DE:AD:30
	post-up /usr/sbin/ip link set enp7s0f0np0 vf 1 mac BA:DD:AD:DE:AD:31

到这儿整个这一步就做完了,能够重启一下机器验证一下装备有没有成功啦。

最终

谢谢你能看到这儿!