簡(jiǎn)單地說(shuō),SR-IOV是一種讓一臺(tái)主機(jī)上的多臺(tái)虛擬機(jī)和主機(jī)系統(tǒng)本身合用同一張物理網(wǎng)卡的技術(shù),每臺(tái)虛擬機(jī)都認(rèn)為自己擁有一張獨(dú)立的網(wǎng)卡(即一個(gè)VF),而其實(shí)它們都被騙了~~
由于手上只有一臺(tái)Linux主機(jī)和一張Mellanox ConnectX-4 LX 10G網(wǎng)卡(雙物理網(wǎng)口),為了研究SR-IOV,我只能搭建了如下圖所示的極簡(jiǎn)測(cè)試環(huán)境。這塊網(wǎng)卡支持RoCE(RDMA),但在這里只使用它的以太網(wǎng)功能。
對(duì)于宿主機(jī)的操作系統(tǒng)來(lái)說(shuō),這塊網(wǎng)卡的兩個(gè)物理網(wǎng)口可以看作兩個(gè)獨(dú)立的網(wǎng)卡/網(wǎng)絡(luò)接口。如果運(yùn)行ifconfig,可以看到系統(tǒng)中存在enp6s0f0np0和enp6s0f1np1兩個(gè)網(wǎng)口。
之所以會(huì)這樣,是因?yàn)?a href="http://srfitnesspt.com/v/tag/1751/" target="_blank">硬件向系統(tǒng)展現(xiàn)了兩個(gè)PCIe設(shè)備,準(zhǔn)確地說(shuō)是兩個(gè)功能號(hào)。
比如用下面這個(gè)命令,可以看到這兩個(gè)PCIe設(shè)備的"bus:slot.func",即"總線號(hào):設(shè)備號(hào):功能號(hào)"。
$ lspci -D | grep Mellanox
0000:06:00.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
0000:06:00.1 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
一旦網(wǎng)卡被插在PCIe插槽上,它的bus和slot就確定了,并且是唯一的。但硬件只要提供兩個(gè)獨(dú)立的func,就會(huì)被Linux檢測(cè)為兩個(gè)獨(dú)立的PCIe設(shè)備,從而對(duì)應(yīng)兩個(gè)獨(dú)立的網(wǎng)口。
準(zhǔn)備好上述硬件連接和操作系統(tǒng)(Ubuntu 20.04.6)后,我們需要做如下幾件事才能使用SR-IOV功能。此處主要的參考文獻(xiàn)為《HOWTO CONFIGURE SR-IOV FOR CONNECTX-4/CONNECTX-5/CONNECTX-6 WITH KVM (ETHERNET)》。本文并非操作手冊(cè),所以一些網(wǎng)上可以很容易搜到的東西我就不詳細(xì)說(shuō)明了。
- 在BIOS中打開(kāi)SR-IOV功能,一般位于PCI配置中。
- 在Linux啟動(dòng)命令行中添加“intel_iommu=on iommu=pt”(對(duì)于Intel CPU)。
- 在Ubuntu中安裝虛擬機(jī)(只安裝virt-manager就幾乎把所有組件都安裝了)。
- 在宿主機(jī)安裝Mellanox網(wǎng)卡驅(qū)動(dòng)。
安裝文件為MLNX_OFED_LINUX-5.8-2.0.3.0-ubuntu20.04-x86_64.tgz,需要從NVIDIA網(wǎng)站下載。
如果以后要看代碼還需要下載MLNX_OFED_SRC-debian-5.8-2.0.3.0.tgz 。
- 設(shè)置網(wǎng)卡的固件,使其支持SR-IOV。比如運(yùn)行如下命令,將網(wǎng)卡最大支持的VF數(shù)量設(shè)置為8個(gè)。
*sudo mlxconfig -d /dev/mst/mt4117_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=8*
- 設(shè)置MLNX_OFED驅(qū)動(dòng)(最終也會(huì)設(shè)置硬件),打開(kāi)SR-IOV功能。
比如運(yùn)行如下命令,使能4個(gè)VF。
echo 4 > /sys/class/net/enp6s0f1np1/device/sriov_numvfs
此時(shí)系統(tǒng)中會(huì)呈現(xiàn)4個(gè)VFs(每個(gè)都是一個(gè)PCIe設(shè)備),分別對(duì)應(yīng)下面的后四行,即0000:06:00.2(后三個(gè)數(shù)就是"bus:slot.func")、0000:06:00.3、0000:06:00.4和0000:06:00.5。
$ lspci -D | grep Mellanox
0000:06:00.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
0000:06:00.1 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
0000:06:01.2 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function]
0000:06:01.3 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function]
0000:06:01.4 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function]
0000:06:01.5 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function]
- 把第一個(gè)VF添加到虛擬機(jī)中,虛擬機(jī)會(huì)把它認(rèn)做一個(gè)獨(dú)立的PCIe設(shè)備。
這里給一個(gè)配置虛擬機(jī)的參考圖。
- 在虛擬機(jī)中安裝MLNX_OFED驅(qū)動(dòng)。
此時(shí)我們會(huì)得到如下圖所示的測(cè)試環(huán)境。
如果我們?cè)谔摂M機(jī)里把enp6s0的IP設(shè)置為192.168.8.1。
然后在宿主機(jī)里把兩個(gè)原有的非VF的系統(tǒng)網(wǎng)口的IP設(shè)置為192.168.8.2(enp6s0f0np0)和192.168.8.3(enp6s0f1np1),并把VF3(在宿主機(jī)中)對(duì)應(yīng)的網(wǎng)口enp6s0f1v3的IP設(shè)置為192.168.8.4。
在虛擬機(jī)中是可以ping通上述后三個(gè)IP的。
當(dāng)然在這三種情況下數(shù)據(jù)走的物理通路是不同的。
按照我淺薄的認(rèn)識(shí),我認(rèn)為從虛擬機(jī)中ping后面三個(gè)IP時(shí),應(yīng)該對(duì)應(yīng)下圖中三條彩色虛線所示的數(shù)據(jù)通路。
對(duì)于不同的物理網(wǎng)口,數(shù)據(jù)肯定會(huì)通過(guò)光纖。
對(duì)于屬于相同物理網(wǎng)口的PF(對(duì)應(yīng)原系統(tǒng)網(wǎng)口)和VFs,我認(rèn)為網(wǎng)卡硬件中存在一個(gè)內(nèi)部的交換機(jī)機(jī)制,使得所有PF和VFs之間都可以轉(zhuǎn)發(fā)數(shù)據(jù)包。之所以這樣想,是由于做了如下測(cè)試:
①在虛擬機(jī)中連續(xù)地ping 192.168.8.5,這是一個(gè)并不存在的地址。
②同時(shí)在宿主機(jī)上依次用“tcpdump -i enpXXXX”命令監(jiān)視每個(gè)網(wǎng)口,包括未配置IP的VF。
可以發(fā)現(xiàn)每個(gè)網(wǎng)口都會(huì)持續(xù)收到ARP報(bào)文。如果數(shù)據(jù)沒(méi)有經(jīng)過(guò)硬件而是在操作系統(tǒng)內(nèi)部直接處理掉了,那這么做是完全沒(méi)必要的,因?yàn)橄到y(tǒng)知道每個(gè)網(wǎng)口的IP。并且ifconfig命令輸出中也會(huì)顯示每個(gè)網(wǎng)口的RX計(jì)數(shù)在持續(xù)增加,這種計(jì)數(shù)一般在驅(qū)動(dòng)中實(shí)現(xiàn),而且只有驅(qū)動(dòng)真正從硬件收到包時(shí)才會(huì)增加計(jì)數(shù)。
在今后閱讀相關(guān)驅(qū)動(dòng)代碼時(shí)我還會(huì)關(guān)注這一點(diǎn)。歡迎高手來(lái)拍磚。
本文只是搭建了一個(gè)簡(jiǎn)單的測(cè)試環(huán)境,嘗試使用SR-IOV功能。接下來(lái)我會(huì)研究Linux系統(tǒng)和Mellanox驅(qū)動(dòng)中做了哪些事情支持SR-IOV功能,以及猜測(cè)需要硬件做哪些工作。
-
以太網(wǎng)
+關(guān)注
關(guān)注
40文章
5323瀏覽量
170552 -
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
588瀏覽量
27274 -
虛擬機(jī)
+關(guān)注
關(guān)注
1文章
900瀏覽量
27981 -
RDMA
+關(guān)注
關(guān)注
0文章
75瀏覽量
8907 -
PCIe接口
+關(guān)注
關(guān)注
0文章
117瀏覽量
9656
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論