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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章