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.2192.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也跑通了。

posted @ 2024-05-13 15:19  CQzhangyu  阅读(1059)  评论(0编辑  收藏  举报