SR-IOV概念
single root input/output virtualization,SR-IOV可以將一個(gè)獨(dú)立的物理PCI資源劃分成多個(gè)虛擬的PCI資源引镊,并可以加載到虛擬機(jī)內(nèi)使用朦蕴。由于有了網(wǎng)絡(luò)VF,令流量繞過宿主機(jī)的網(wǎng)絡(luò)棧弟头,SR-IOV增強(qiáng)了南北向(從虛擬機(jī)末端流出宿主機(jī)的流量)的網(wǎng)絡(luò)性能吩抓。
支持的網(wǎng)卡型號(hào)
Intel X710(32VF)、XL710(64VF)赴恨、X540(32VF)等
接入方法
- 作為SR-IOV VF PCI的直通設(shè)備接入
- 使用macvtap作為SR-IOV網(wǎng)絡(luò)適配器
- 使用KVM的虛擬網(wǎng)絡(luò)適配器池疹娶,作為SR-IOV網(wǎng)絡(luò)適配器接入
- 如果使用XL710網(wǎng)卡,需要在虛擬機(jī)內(nèi)安裝Data Plane Development Kit (DPDK) 伦连,否則無法達(dá)到最高性能雨饺。
一、直通設(shè)備接入
-
查看VF PCI的總線信息惑淳,也可以使用該腳本查看https://github.com/intel/SDN-NFV-Hands-on-Samples/blob/master/SR-IOV_Network_Virtual_Functions_in_KVM/listvfs_by_pf.sh
# lshw -c network -businfo
-
添加一個(gè)<hostdev>的tag到虛擬機(jī)额港。
通過上面的腳本將查看到的domain、bus歧焦、slot及function信息寫入tag內(nèi)移斩。
# virsh edit <name of virtual machine> # virsh dump <name of virtual machine> <domain> … <devices> … <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x03' slot='0x10' function='0x0'/> </source> </hostdev> … </devices> … </domain>
啟動(dòng)虛擬機(jī)。
二、使用macvtap作為SR-IOV網(wǎng)絡(luò)適配器
這種方式不需要知道VF 的PCI總線信息向瓷,只需要知道系統(tǒng)創(chuàng)建的VF的接口名稱肠套。
執(zhí)行腳本,確定VF的接口名稱猖任。
-
關(guān)機(jī)你稚,增加interface的tag到虛擬機(jī)。
# virsh edit <name of virtual machine> # virsh dump <name of virtual machine> <domain> … <devices> … <interface type='direct'> <source dev='enp3s16f1' mode='passthrough'/> </interface> … </devices> … </domain>
當(dāng)虛擬機(jī)開機(jī)后超升,KVM會(huì)在指定的VF接口創(chuàng)建一個(gè)macvtap的適配器入宦,在宿主上能看到一個(gè)macvtap適配器摊沉,它的mac地址和vm內(nèi)的設(shè)備是不同的枉圃。實(shí)際上,一個(gè)macvtap設(shè)備會(huì)被分配了兩個(gè)mac地址疏日,這種復(fù)雜的配置可能會(huì)導(dǎo)致網(wǎng)絡(luò)性能變差盈滴。
三涯肩、使用KVM的虛擬網(wǎng)絡(luò)適配器池
用這種方式配置既不需要知道VF的PCI信息也不需要知道VF的接口名稱,只需要知道物理網(wǎng)卡的名稱即可完成配置巢钓。KVM將會(huì)創(chuàng)建一個(gè)VF網(wǎng)絡(luò)設(shè)備的資源池病苗,資源池內(nèi)的設(shè)備可以自動(dòng)地分配給虛擬機(jī)使用,資源池內(nèi)的設(shè)備數(shù)量取決于物理網(wǎng)絡(luò)創(chuàng)建的VF數(shù)量症汹。
-
創(chuàng)建虛擬網(wǎng)絡(luò)適配器池硫朦。
查看已經(jīng)創(chuàng)建了VF的網(wǎng)卡設(shè)備,找到出現(xiàn)vf字段的設(shè)備背镇。
ip l
創(chuàng)建一個(gè)XML咬展。
# cat > sr-iov-net-XL710.xml << EOF > <network> > <name>sr-iov-net-40G-XL710</name> > <forward mode='hostdev' managed='yes'> > <pf dev='ens802f0'/> > </forward> > </network> > EOF
Virsh define這個(gè)網(wǎng)絡(luò)池。
# virsh net-define sr-iov-net-XL710.xml
-
展示全部的虛擬網(wǎng)絡(luò)瞒斩。
# virsh net-list --all Name State Autostart Persistent ---------------------------------------------------------- default active yes yes sr-iov-net-40G-XL710 inactive no yes
-
啟動(dòng)及配置自啟動(dòng)破婆。
# virsh net-start sr-iov-net-40G-XL710 # virsh net-autostart sr-iov-net-40G-XL710
-
使用virsh-edit增加一個(gè)網(wǎng)絡(luò)適配器的tag,從網(wǎng)絡(luò)池接入一個(gè)設(shè)備到虛擬機(jī)胸囱。
# virsh edit <name of virtual machine> # virsh dump <name of virtual machine> <domain> … <devices> … <interface type='network'> <source network='sr-iov-net-40G-XL710'/> </interface> … </devices> … </domain>
-
啟動(dòng)虛擬機(jī)祷舀。
# virsh start <name of virtual machine>
參考:https://software.intel.com/en-us/articles/configure-sr-iov-network-virtual-functions-in-linux-kvm