Mellanox网卡开启SR-IOV
Mellanox网卡开启SR-IOV
SR-IOV是网卡虚拟化的一个重要功能。本文讲介绍如何在Mellanox网卡上开启SR-IOV,并创建一些VF。
参考:Mellanox网卡开启SR-IOV方法简介-天翼云开发者社区 - 天翼云 (ctyun.cn)
在BIOS中开启IOMMU
- 先查看是否已经开启了IOMMU。
$ dmesg | grep -i dmar
什么输出也没有,说明没有开启IOMMU。我们需要修改grub来开启IOMMU。
$ sudo vim /etc/default/grub
- 在GRUB_CMDLINE_LINUX字段中添加:
intel_iommu=on iommu=pt
- 更新grub,然后重启。
$ sudo update-grub
$ sudo reboot
- 再次查看IOMMU是否开启
$ dmesg | grep -i dmar
[ 0.745740] DMAR: IOMMU enabled
开启网卡的SR-IOV
- 开启Mellanox的mst工具。
$ sudo mst start
Starting MST (Mellanox Software Tools) driver set
Loading MST PCI module - Success
Loading MST PCI configuration module - Success
Create devices
Unloading MST PCI module (unused) - Success
如果你显示sudo: mst: command not found
,则移步安装MFT。
- 查看mst状态:
$ sudo mst status
MST modules:
------------
MST PCI module is not loaded
MST PCI configuration module loaded
MST devices:
------------
/dev/mst/mt4119_pciconf0 - PCI configuration cycles access.
domain:bus:dev.fn=0000:e3:00.0 addr.reg=88 data.reg=92 cr_bar.gw_offset=-1
Chip revision is: 00
可以看到我们的网卡在mst里的名称是mt4119_pciconf0。
- 查看SR-IOV是否开启
$ sudo mlxconfig -d /dev/mst/mt4119_pciconf0 q
...
NUM_OF_VFS 0
...
SRIOV_EN False(0)
可以看到当前SRIOV_EN
是False,NUM_OF_VFS
是0。说明没有开启SR-IOV。
- 开启SR-IOV,设置VF数量为4。注意NUM_OF_VFS是VF的数量上限,不是已经分配的VF数量。
$ sudo mlxconfig -d /dev/mst/mt4119_pciconf0 set SRIOV_EN=1
$ sudo mlxconfig -d /dev/mst/mt4119_pciconf0 set NUM_OF_VFS=4
- 然后再次重启机器
$ sudo reboot
- 再次打开mst,查看设备状态,发现SR-IOV已经开启。
$ sudo mst start
$ sudo mlxconfig -d /dev/mst/mt4119_pciconf0 q
NUM_OF_VFS 4
SRIOV_EN True(1)
配置VF
- 查看现有的pci设备。
$ lspci -D | grep Mellanox
0000:e3:00.0 Infiniband controller: Mellanox Technologies MT27800 Family [ConnectX-5]
0000:e3:00.1 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5]
- 查看现有的ib设备和网络设备。
$ sudo ibdev2netdev -v
0000:e3:00.0 mlx5_0 (MT4119 - MCX556A-ECAT) CX556A - ConnectX-5 QSFP28 fw 16.35.3006 port 1 (ACTIVE) ==> ibs10f0 (Up)
0000:e3:00.1 mlx5_1 (MT4119 - MCX556A-ECAT) CX556A - ConnectX-5 QSFP28 fw 16.35.3006 port 1 (ACTIVE) ==> ens10f1 (Up)
接下来我们想要为ens10f1
这个网络设备PF添加一些VF。
- 查看当前设备的VF数量。
$ cat /sys/class/net/ens10f1/device/sriov_totalvfs
4
$ cat /sys/class/net/ens10f1/device/sriov_numvfs
0
- 修改VF数量。
$ sudo chmod +666 /sys/class/net/ens10f1/device/sriov_numvfs
$ sudo echo 4 > /sys/class/net/ens10f1/device/sriov_numvfs
- 再次查看PCI设备和网络设备。
$ lspci -D | grep Mellanox
0000:e3:00.0 Infiniband controller: Mellanox Technologies MT27800 Family [ConnectX-5]
0000:e3:00.1 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5]
0000:e3:00.6 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5 Virtual Function]
0000:e3:00.7 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5 Virtual Function]
0000:e3:01.0 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5 Virtual Function]
0000:e3:01.1 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5 Virtual Function]
$ sudo ibdev2netdev -v
0000:e3:00.0 mlx5_0 (MT4119 - MCX556A-ECAT) CX556A - ConnectX-5 QSFP28 fw 16.35.3006 port 1 (ACTIVE) ==> ibs10f0 (Up)
0000:e3:00.1 mlx5_1 (MT4119 - MCX556A-ECAT) CX556A - ConnectX-5 QSFP28 fw 16.35.3006 port 1 (ACTIVE) ==> ens10f1 (Up)
0000:e3:00.6 mlx5_2 (MT4120 - NA) fw 16.35.3006 port 1 (ACTIVE) ==> ens10f1v0 (Up)
0000:e3:00.7 mlx5_3 (MT4120 - NA) fw 16.35.3006 port 1 (ACTIVE) ==> ens10f1v1 (Up)
0000:e3:01.0 mlx5_4 (MT4120 - NA) fw 16.35.3006 port 1 (ACTIVE) ==> ens10f1v2 (Up)
0000:e3:01.1 mlx5_5 (MT4120 - NA) fw 16.35.3006 port 1 (ACTIVE) ==> ens10f1v3 (Up)
此时,可以看到我们新创建的4个VF了。注意:重启后vf数量会失效。
为VF配置IP
我们在两台机器上都开启了SR-IOV。我想配置它们的ip分别是192.168.2.2
和192.168.2.4
。
- 查看所有ip信息(以
192.168.2.4
为例)。
$ ip a
5: ens10f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 10:70:fd:2f:d4:21 brd ff:ff:ff:ff:ff:ff
inet6 fe80::8f36:7219:df0c:edf8/64 scope link noprefixroute
valid_lft forever preferred_lft forever
8: ens10f1v0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 2a:17:20:98:c7:81 brd ff:ff:ff:ff:ff:ff
9: ens10f1v1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether fa:b8:4a:ac:64:33 brd ff:ff:ff:ff:ff:ff
10: ens10f1v2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 8a:de:57:f1:46:6e brd ff:ff:ff:ff:ff:ff
11: ens10f1v3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether ba:6f:52:30:3e:ea brd ff:ff:ff:ff:ff:ff
可以看到目前的VF只有mac没有ip。
于是可以写如下的脚本:
- 在
192.168.2.4
的机器上:
sudo ip addr flush dev ens10f1v0
sudo ip addr add 192.168.2.4/24 dev ens10f1v0
sudo ip link set ens10f1v0 up
sudo arp -s 192.168.2.2 fe:0d:d9:e0:00:25 -i ens10f1v0
sudo arp -s 192.168.2.4 2a:17:20:98:c7:81 -i ens10f1v0
在192.168.2.2
上只需把第二行的192.168.2.4/24
换成192.168.2.2/24
。
- 再次查看ip(以
192.168.2.4
为例)。
$ ip a
5: ens10f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 10:70:fd:2f:d4:21 brd ff:ff:ff:ff:ff:ff
inet6 fe80::8f36:7219:df0c:edf8/64 scope link noprefixroute
valid_lft forever preferred_lft forever
8: ens10f1v0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 2a:17:20:98:c7:81 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.4/24 scope global ens10f1v0
valid_lft forever preferred_lft forever
9: ens10f1v1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether fa:b8:4a:ac:64:33 brd ff:ff:ff:ff:ff:ff
10: ens10f1v2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 8a:de:57:f1:46:6e brd ff:ff:ff:ff:ff:ff
11: ens10f1v3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether ba:6f:52:30:3e:ea brd ff:ff:ff:ff:ff:ff
发现有ip地址了。
- 查看arp(以
192.168.2.4
为例)。
$ arp
Address HWtype HWaddress Flags Mask Iface
worker4 ether 2a:17:20:98:c7:81 CM ens10f1v0
192.168.2.2 ether fe:0d:d9:e0:00:25 CM ens10f1v0
路由表也配置好了。
另外,如果你在两台机器之间用交换机来负责路由,你还要对你的交换机进行相应的配置!
测试
ping
- 我们ping一下试试。在
192.168.2.2
上:
$ ping 192.168.2.4
PING 192.168.2.4 (192.168.2.4) 56(84) bytes of data.
64 bytes from 192.168.2.4: icmp_seq=1 ttl=64 time=0.142 ms
64 bytes from 192.168.2.4: icmp_seq=2 ttl=64 time=0.075 ms
发现可以ping通了!
RoCE
- 查看gid(以
192.168.2.4
为例)。
$ show_gids
DEV PORT INDEX GID IPv4 VER DEV
--- ---- ----- --- ------------ --- ---
...
mlx5_2 1 0 fe80:0000:0000:0000:2817:20ff:fe98:c781 v1 ens10f1v0
mlx5_2 1 1 fe80:0000:0000:0000:2817:20ff:fe98:c781 v2 ens10f1v0
mlx5_2 1 2 0000:0000:0000:0000:0000:ffff:c0a8:0204 192.168.2.4 v1 ens10f1v0
mlx5_2 1 3 0000:0000:0000:0000:0000:ffff:c0a8:0204 192.168.2.4 v2 ens10f1v0
...
我们想要使用RoCEv2,因此应当选取gid编号为3。
- 在
192.168.2.2
上:
$ ib_send_bw -d mlx5_2 -x 3
- 在
192.168.2.4
上:
$ ib_send_bw 192.168.2.2 -d mlx5_2 --report_gbits -F -x 3
- 结果:
---------------------------------------------------------------------------------------
Send BW Test
Dual-port : OFF Device : mlx5_2
Number of qps : 1 Transport type : IB
Connection type : RC Using SRQ : OFF
PCIe relax order: ON
ibv_wr* API : ON
TX depth : 128
CQ Moderation : 1
Mtu : 1024[B]
Link type : Ethernet
GID index : 3
Max inline data : 0[B]
rdma_cm QPs : OFF
Data ex. method : Ethernet
---------------------------------------------------------------------------------------
local address: LID 0000 QPN 0x0107 PSN 0x7b2724
GID: 00:00:00:00:00:00:00:00:00:00:255:255:192:168:02:04
remote address: LID 0000 QPN 0x0107 PSN 0x3e7431
GID: 00:00:00:00:00:00:00:00:00:00:255:255:192:168:02:02
---------------------------------------------------------------------------------------
#bytes #iterations BW peak[Gb/sec] BW average[Gb/sec] MsgRate[Mpps]
65536 1000 92.33 92.32 0.176085
---------------------------------------------------------------------------------------
RoCE也跑通了。
| 欢迎来原网站坐坐! >原文链接<