詳解基于KVM的SRIOV直通配置及性能測(cè)試
SRIOV介紹、VF直通配置,以及包轉(zhuǎn)發(fā)率性能測(cè)試
目錄
- 1. SRIOV介紹
- 2. 環(huán)境說明
- 3. 開啟SRIOV
- 4. 生成VF
- 5. VF直通
- 6. 開啟irqbalance
- 7. VM遷移
- 8. 帶寬限速
- 9. 安全
- 10. 其他使用限制
- 11. 性能測(cè)試
- 12. windows虛擬機(jī)使用VF
- 13. 運(yùn)維命令
- 14. 宿主屏蔽VF驅(qū)動(dòng)
- 附. 包轉(zhuǎn)發(fā)率測(cè)試方法
- 附. 參考文檔
1. SRIOV介紹
▷ 傳統(tǒng)方式的瓶頸:qemu的網(wǎng)卡,傳統(tǒng)方式是使用tap網(wǎng)卡,橋接到宿主的bridge上,但性能很差,尤其是包轉(zhuǎn)發(fā)率很低,難以滿足對(duì)性能要求比較高的場(chǎng)景。性能差的主要原因是路徑太長(zhǎng),經(jīng)過的內(nèi)核設(shè)備太多,根本原因在于linux/unix內(nèi)核本身就不是為高性能而設(shè)計(jì)的,linux/unix更適合做控制平面,而不是轉(zhuǎn)發(fā)平面。
▷ 解決思路:減少中間路徑,最簡(jiǎn)單有效的方法就是bypass內(nèi)核。SRIOV的作用就是bypass宿主內(nèi)核。
▷ PF和VF:每個(gè)物理網(wǎng)卡(比如p1p1)就是一個(gè)PF,在開啟SRIOV后,每個(gè)PF可以生成固定數(shù)量的VF,每個(gè)VF都可以在宿主上作為一張網(wǎng)卡直接使用,或者直通到QEMU虛擬機(jī)里作為虛擬機(jī)里的網(wǎng)卡使用,這就實(shí)現(xiàn)了bypass宿主內(nèi)核。
先給出性能測(cè)試的結(jié)論,SRIOV VF直通相比傳統(tǒng)tap+bridge方案,性能提升:
▷ 發(fā)包轉(zhuǎn)發(fā)率提高: 677%
▷ 收包轉(zhuǎn)發(fā)率提高: 171%
2. 環(huán)境說明
機(jī)型:Dell PowerEdge R620
網(wǎng)卡:Intel X520(82599ES)
宿主OS:CentOS 7
VM OS:CentOS 7
3. 開啟SRIOV
在BIOS里開啟SRIOV,如圖所示
注:即使BIOS里開啟全局SRIOV,網(wǎng)卡也依然可以當(dāng)作普通網(wǎng)卡使用
需要在BIOS里開啟VT-d
grub配置iommu
iommu=pt intel_iommu=on
4. 生成VF
# 啟動(dòng)網(wǎng)卡 ip link set p1p1 up # 查看pf的pci編號(hào) lshw -c network -businfo # 查看網(wǎng)卡支持的vf數(shù)量 cat /sys/bus/pci/devices/0000:41:00.0/sriov_totalvfs # 生成vf,建議加入開機(jī)啟動(dòng) echo 63 > /sys/bus/pci/devices/0000:41:00.0/sriov_numvfs
注意:若沒有屏蔽宿主的VF驅(qū)動(dòng),則在生成vf后還必須等待一會(huì)時(shí)間才能在宿主上看到所有命名完成的網(wǎng)卡(否則會(huì)看到一堆ethX網(wǎng)卡),vf數(shù)量越多需要等待時(shí)間越長(zhǎng),63個(gè)vf,差不多需要10秒
5. VF直通
如果qemu是通過libvirt管理的,有3種配置方法:
▷ 方法1(interface):在devices段落里加入
<interface type='hostdev' managed='yes'> <mac address='52:54:00:ad:ef:8d'/> <source> <address type='pci' domain='0x0000' bus='0x41' slot='0x10' function='0x0'/> </source> <vlan> <tag id='4010'/> </vlan> </interface>
上面<source>中address的地址,可以根據(jù)“l(fā)shw -c network -businfo”來配置,比如
pci@0000:41:10.0 p1p1_0
▷ 方法2(hostdev):在devices段落里加入
<hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x41' slot='0x10' function='0x0'/> </source> </hostdev>
上面<source>中address的地址,也是根據(jù)“l(fā)shw -c network -businfo”來配置
▷ 方法3(net-pool)
為每個(gè)PF網(wǎng)卡定義一個(gè)net-pool,即分別編輯一個(gè)xml文件。這里僅展示一個(gè)PF,編輯sriov-int.xml
<network> <name>sriov-int</name> <forward mode='hostdev' managed='yes'> <pf dev='p1p1'/> </forward> </network>
加入到libvirt net-pool、激活、并設(shè)置開機(jī)啟動(dòng)
virsh net-define sriov-int.xml virsh net-start sriov-int virsh net-autostart sriov-int
雖然配置了net-autostart,但并不管用,因?yàn)槲锢頇C(jī)啟動(dòng)時(shí)候,經(jīng)常會(huì)在啟動(dòng)生成vf(假設(shè)在rc.local里生成vf)之前就啟動(dòng)libvirt,而這個(gè)net-pool(sriov-int)本應(yīng)該在vf生成后才能啟動(dòng),因此建議在rc.local里增加如下內(nèi)容來確保啟動(dòng)
ip link set p1p2 up echo 63 > /sys/bus/pci/devices/0000:41:00.0/sriov_numvfs virsh net-start sriov-int
然后,在vm的xml里增加
<interface type='network'> <mac address='52:54:00:ad:ef:8d'/> <source network='sriov-int'/> <vlan> <tag id='4010'/> </vlan> </interface>
3種方法如何選擇
▷ 方法1:功能多,可以配置mac和vlan
▷ 方法2:mac和vlan需要自己在宿主上敲ip命令設(shè)置
▷ 方法3:有2個(gè)問題
存在一個(gè)bug,當(dāng)本宿主所有vm使用某個(gè)PF的VF總數(shù)超過VF上限后,不會(huì)報(bào)錯(cuò),也能啟動(dòng),但是可能會(huì)有異常,并且vm如果被destroy關(guān)機(jī),那么對(duì)應(yīng)的VF就會(huì)出問題,比如使用ip link set p1p1 vf 0 mac 00:00:00:00:00:00來做重置時(shí)候,會(huì)提示“RTNETLINK answers: Cannot allocate memory”,而且難以修復(fù),即使修復(fù),也不知道有沒有看不見的異常存在。
沒有辦法知道某個(gè)vm使用的是哪個(gè)vf,因此如果要對(duì)vf設(shè)置限速或者開關(guān)spoofchk時(shí)候,只能先在宿主上通過“ip link show dev p1p1 | grep MAC地址”方式來獲得vf號(hào),然后才能設(shè)置限速等操作
綜上所述:使用方法3最便捷,但是存在bug,因此需要做好邏輯來防止vm使用vf總數(shù)超過上限的情況。
6. 開啟irqbalance
x520是2隊(duì)列,x710是4隊(duì)列,需要在vm里啟動(dòng)中斷平衡服務(wù)(irqbalance),否則只會(huì)有一個(gè)cpu來處理數(shù)據(jù)包。
另外,這與宿主上vf的query_rss無關(guān)。
7. VM遷移
直通網(wǎng)卡屬于PCI設(shè)備,而libvirt和qemu卻不支持帶有非USB的PCI設(shè)備的vm做遷移,包括冷遷移和熱遷移。因此熱遷移無法實(shí)現(xiàn)。
冷遷移,有2種方案:
▷ detach掉vf網(wǎng)卡,然后使用libvirt做遷移,遷移過去后,再在新宿主上attach vf網(wǎng)卡
▷ undefine vm,然后在新宿主上重新渲染并define vm
注意:不能在vm關(guān)機(jī)時(shí)候用libvirt的遷移功能,有時(shí)候會(huì)導(dǎo)致虛擬機(jī)消失掉,包括原宿主和新宿主
8. 帶寬限速
只能限制出站帶寬,無法限制入站帶寬
ip link set p1p1 vf 0 max_tx_rate 100
表示出站帶寬限速100Mbps,不同網(wǎng)卡有差別:
▷ x520網(wǎng)卡最小限速11Mbps,最大限速10000Mbps,設(shè)為0表示不限速。若小于11或大于10000則會(huì)報(bào)錯(cuò)
▷ x710網(wǎng)卡最小限速50Mbps,最大限速10000Mbps,設(shè)為0表示不限速。若小于50則自動(dòng)設(shè)為50,若大于10000則會(huì)報(bào)錯(cuò)
注意:vm關(guān)機(jī)后vf的帶寬限速不會(huì)復(fù)位
9. 安全
僅支持源mac過濾和網(wǎng)卡mac防篡改,不支持其他安全防護(hù)(防arp欺騙就無法實(shí)現(xiàn))
源mac過濾
ip link set p1p1 vf 0 spoofchk on
表示vm里發(fā)出的包,如果源mac不是指定mac,那么數(shù)據(jù)包不允許通過。注意:vm關(guān)機(jī)后vf的spoofchk不會(huì)復(fù)位
網(wǎng)卡mac防篡改
▷ 在宿主上修改mac,vm里的mac不會(huì)跟著改;在vm里修改mac,在宿主上可以看到變化
▷ 如果在vm關(guān)機(jī)狀態(tài)下改了mac地址,那么當(dāng)vm開機(jī)后會(huì)改為vm的mac,當(dāng)vm又關(guān)機(jī)后,又回改為原先改的mac
▷ 只有在宿主上看到的當(dāng)前vf的mac為全0,才能在vm里修改mac地址,即使vf的spoofchk為off。但有一種例外,若使用上面方法2來配置xml,雖然宿主上看到的vf的mac不為0,但vm里可以修改
▷ 當(dāng)在宿主上設(shè)置了mac后,虛擬機(jī)里的mac就無法篡改了
▪ 方法1(interface)來配置xml,估計(jì)vm啟動(dòng)時(shí)候就自動(dòng)幫忙在宿主上設(shè)置了mac,所以就直接實(shí)現(xiàn)了防篡改功能
▪ 方法2(hostdev)來配置xml,需要在宿主上手動(dòng)再設(shè)置一次mac地址才能實(shí)現(xiàn)防篡改
在宿主上手動(dòng)修改mac方法(vm關(guān)機(jī)和開機(jī)情況下都可以改):
ip link set p1p1 vf 0 mac aa:bb:cc:dd:ee:ff
建議:
▷ 在vm啟動(dòng)前對(duì)vf做一次重置
▷ 在vm undefine后對(duì)vf做一次重置
10. 其他使用限制
▷ 直通到vm里的vf網(wǎng)卡里無法橋接到vm里的linux bridge,這也導(dǎo)致ebtables無法使用,iptables可以使用
▷ 直通到vm里的vf網(wǎng)卡可以加入ovs橋接
▷ 一個(gè)vm最多只能支持32個(gè)vf,超過數(shù)量會(huì)報(bào)錯(cuò)
11. 性能測(cè)試
測(cè)試方法:
▷ 多臺(tái)vm同時(shí)發(fā)包,一臺(tái)vm收包,分別觀察發(fā)包性能和收包性能
▷ 發(fā)包vm在同一臺(tái)宿主上,收包vm在另一臺(tái)宿主上
▷ 測(cè)試工具:modprobe pktgen
▷ 測(cè)試包大小: udp包,size為64 bytes
配置:
▷ vm配置均為4核8G
▷ 物理網(wǎng)卡均為x520(vf隊(duì)列默認(rèn)為2)
▷ 宿主和vm均開啟irqbalance、均關(guān)閉numad
▷ 不配置cpu綁定、不配置numa綁定
▷ 開啟大頁
測(cè)試結(jié)果:
測(cè)試結(jié)論:
使用SR-IOV+VF直通方式可以明顯提升包轉(zhuǎn)發(fā)率,1對(duì)1的測(cè)試結(jié)果看到kernel態(tài)發(fā)包可以達(dá)到3.5Mpps,收包可以達(dá)到1.9Mpps
▷ 發(fā)包比vxlan提高: 1196%,比vlan提高: 677%。此結(jié)果參考1對(duì)1(1個(gè)發(fā)包vm,1個(gè)收包vm)
▷ 收包比vxlan提高: 363%,比vlan提高: 171%。此結(jié)果參考3對(duì)1(3個(gè)發(fā)包vm,1個(gè)收包vm)
說明:
▷ kernel態(tài)單核數(shù)據(jù)包(64B)處理能力為2Mpps
▷ 2Mpps是因?yàn)閗ernel態(tài)瓶頸是2Mpps,如果通過dpdk走用戶態(tài),則可以大于2M,原因:收包端要將數(shù)據(jù)包中斷平衡到不同的cpu上,方法:可以通過多隊(duì)列方式,把每個(gè)隊(duì)列分配到單獨(dú)cpu上(irqbalance會(huì)自動(dòng)均衡),然后source ip不一樣,就會(huì)對(duì)應(yīng)到不同隊(duì)列,也就是不同的中斷上。即1個(gè)VF,2個(gè)隊(duì)列,VM有至少2核,那么當(dāng)符合負(fù)載均衡條件(mac、ip不同),則理論上最大可以達(dá)到4Mpps
更多測(cè)試結(jié)果:
以下測(cè)試使用的packet大小為64B
▷ kernel態(tài),3層轉(zhuǎn)發(fā)性能:發(fā)包器使用不同的source ip
▪ BCM57800:2Mpps
▪ Intel X520:10Mpps
▪ Intel X710:12Mpps
▷ kernel態(tài),2層轉(zhuǎn)發(fā)性能:發(fā)包器使用不同的source mac
▪ BCM57800:2Mpps
▪ Intel X520:7.3Mpps
▪ Intel X710:7.8Mpps
▷ kernel態(tài)下vxlan封裝能力
▪ vxlan內(nèi)層使用不同的source ip發(fā)包
▪ 收包在:1.1-1.2Mpps
▷ dpdk用戶態(tài),2層轉(zhuǎn)發(fā)性能:發(fā)包器使用不同的source ip
▪ BCM57800:不支持
▪ Intel X520:14.8Mpps
▪ Intel X710:14.8Mpps
▷ SR-IOV模式
▪ X520總量11.2Mpps,每vm為11.2Mpps/vm總數(shù)(即VF數(shù))
總結(jié):
▷ kernel態(tài)下的中斷平衡的依據(jù)因素:2層依據(jù)source mac,3層依據(jù)source ip
▷ kernel態(tài)下使用傳統(tǒng)中斷模式的單核轉(zhuǎn)發(fā)能力極限2Mpps
注意:
▷ kernel態(tài)下,利用多隊(duì)列RSS中斷平衡提升吞吐率,會(huì)導(dǎo)致cpu非常高
▷ 用戶態(tài)下即使source mac或source ip固定,吞吐率基本接近限速14.8Mpps
▷ vxlan不能利用多核來提升吞吐,主要原因?yàn)橥鈱觭ource ip不夠多
12. windows虛擬機(jī)使用VF
到網(wǎng)卡官網(wǎng)下載對(duì)應(yīng)驅(qū)動(dòng)并安裝,經(jīng)測(cè)試,win2012默認(rèn)就有82599(x520)驅(qū)動(dòng),但版本舊
13. 運(yùn)維命令
# 查看網(wǎng)卡支持的vf數(shù)量 cat /sys/bus/pci/devices/0000:41:00.0/sriov_totalvfs # 宿主屏蔽VF驅(qū)動(dòng)后查看vf和pf的對(duì)應(yīng) https://github.com/intel/SDN-NFV-Hands-on-Samples/blob/master/SR-IOV_Network_Virtual_Functions_in_KVM/listvfs_by_pf.sh 載下來后執(zhí)行./listvfs_by_pf.sh即可 # 宿主屏蔽VF后查看哪些VF正在被使用 yum install dpdk-tools dpdk-devbind --status # 查看網(wǎng)卡對(duì)應(yīng)哪個(gè)socket lstopo-no-graphics # lspci查看網(wǎng)卡信息 lspci -Dvmm|grep -B 1 -A 4 Ethernet # 宿主上查看具體VF流量(僅支持x520,x710查不到) ethtool -S p1p1 | grep VF
14. 宿主屏蔽VF驅(qū)動(dòng)
echo "blacklist ixgbevf" >> /etc/modprobe.d/blacklist.conf
表示當(dāng)物理機(jī)啟動(dòng)時(shí)候,默認(rèn)不加載ixgbevf驅(qū)動(dòng),但是如果手動(dòng)modprobe ixgbevf,則也會(huì)加載驅(qū)動(dòng)。
如果當(dāng)前已經(jīng)加載了ixgbevf,想卸載,則需要如下步驟
echo 0 > /sys/bus/pci/devices/0000:41:00.0/sriov_numvfs rmmod ixgbevf echo 63 > /sys/bus/pci/devices/0000:41:00.0/sriov_numvfs
附. 包轉(zhuǎn)發(fā)率測(cè)試方法
modprobe pktgen:發(fā)包通過pktgen來發(fā),收包通過sar -n DEV來看,發(fā)的是udp包
#!/bin/bash NIC="eth1" DST_IP="192.168.1.2" DST_MAC="52:54:00:43:99:65" modprobe pktgen pg() { echo inject > $PGDEV cat $PGDEV } pgset() { local result echo $1 > $PGDEV result=`cat $PGDEV | fgrep "Result: OK:"` if [ "$result" = "" ]; then cat $PGDEV | fgrep Result: fi } # Config Start Here ----------------------------------------------------------- # thread config # Each CPU has own thread. Two CPU exammple. We add ens7, eth2 respectivly. PGDEV=/proc/net/pktgen/kpktgend_0 echo "Removing all devices" pgset "rem_device_all" echo "Adding ${NIC}" pgset "add_device ${NIC}" # device config # delay 0 means maximum speed. CLONE_SKB="clone_skb 1000000" # NIC adds 4 bytes CRC PKT_SIZE="pkt_size 64" # COUNT 0 means forever COUNT="count 0" DELAY="delay 0" PGDEV=/proc/net/pktgen/${NIC} echo "Configuring $PGDEV" pgset "$COUNT" pgset "$CLONE_SKB" pgset "$PKT_SIZE" pgset "$DELAY" pgset "dst ${DST_IP}" pgset "dst_mac ${DST_MAC}" # Time to run PGDEV=/proc/net/pktgen/pgctrl echo "Running... ctrl^C to stop" pgset "start" echo "Done" # Result can be vieved in /proc/net/pktgen/eth[3,4]
▷ 將腳本開頭的eth1改為發(fā)包對(duì)應(yīng)的網(wǎng)卡
▷ 將腳本開頭的192.168.1.2改為目標(biāo)ip
▷ 將腳本開頭的52:54:00:43:99:65改為目標(biāo)mac
pktgen-dpdk
# 固定ip固定mac set 0 dst ip 192.168.10.240 set 0 src ip 192.168.10.245/24 set 0 dst mac c8:1f:66:d7:58:ba set 0 src mac a0:36:9f:ec:4a:28 # 可變source ip可變source mac stop 0 range 0 src ip 192.168.0.1 192.168.0.1 192.168.200.200 0.0.0.1 range 0 dst ip 10.1.1.241 10.1.1.241 10.1.1.241 0.0.0.0 range 0 dst mac c8:1f:66:d7:58:ba c8:1f:66:d7:58:ba c8:1f:66:d7:58:ba 00:00:00:00:00:00 range 0 src mac a0:36:9f:ec:4a:28 a0:36:9f:ec:4a:28 a0:36:9f:ec:ff:ff 00:00:00:00:01:01 range 0 src port 100 100 65530 1 range 0 dst port 100 100 65530 1 range 0 size 64 64 64 0 enable 0 range enable 0 latency start 0 # 按50%的速率發(fā)包 set 0 rate 50
附. 參考文檔
openstack關(guān)于sriov的限制
https://docs.openstack.org/mitaka/networking-guide/config-sriov.html
遷移
https://wenku.baidu.com/view/d949db67998fcc22bcd10dfd.html
https://www.chenyudong.com/archives/live-migrate-with-pci-pass-through-fail-with-libvirt-and-qemu.html
線速
http://netoptimizer.blogspot.tw/2014/05/the-calculations-10gbits-wirespeed.html
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
CentOS?8?安裝調(diào)試KVM的詳細(xì)步驟
這篇文章主要介紹了CentOS?8?KVM?的安裝調(diào)試,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04KVM虛擬機(jī)實(shí)現(xiàn)在線熱遷移的方法步驟(圖文)
這篇文章主要介紹了KVM虛擬機(jī)實(shí)現(xiàn)在線熱遷移的方法步驟(圖文),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10kvm虛擬化學(xué)習(xí)筆記(一)之kvm虛擬化環(huán)境安裝的步驟
這篇文章主要介紹了kvm虛擬化學(xué)習(xí)筆記(一)之kvm虛擬化環(huán)境安裝的步驟,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2016-12-12詳解kvm部署三個(gè)虛擬機(jī)實(shí)現(xiàn) WordPress 實(shí)驗(yàn)
這篇文章主要介紹了詳解kvm部署三個(gè)虛擬機(jī)實(shí)現(xiàn) WordPress 實(shí)驗(yàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11