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