真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

基于KVM的SRIOV直通配置及性能測試

云計算

SRIOV介紹、VF直通配置,以及包轉(zhuǎn)發(fā)率性能測試

10多年的扎囊網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整扎囊建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“扎囊網(wǎng)站設(shè)計”,“扎囊網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

小慢哥的原創(chuàng)文章,歡迎轉(zhuǎn)載


目錄

? 1. SRIOV介紹
? 2. 環(huán)境說明
? 3. 開啟SRIOV
? 4. 生成VF
? 5. VF直通
? 6. 開啟irqbalance
? 7. VM遷移
? 8. 帶寬限速
? 9. 安全
? 10. 其他使用限制
? 11. 性能測試
? 12. windows虛擬機使用VF
? 13. 運維命令
? 14. 宿主屏蔽VF驅(qū)動
? 附. 包轉(zhuǎn)發(fā)率測試方法
? 附. 參考文檔


1. SRIOV介紹

? 傳統(tǒng)方式的瓶頸:qemu的網(wǎng)卡,傳統(tǒng)方式是使用tap網(wǎng)卡,橋接到宿主的bridge上,但性能很差,尤其是包轉(zhuǎn)發(fā)率很低,難以滿足對性能要求比較高的場景。性能差的主要原因是路徑太長,經(jīng)過的內(nèi)核設(shè)備太多,根本原因在于linux/unix內(nèi)核本身就不是為高性能而設(shè)計的,linux/unix更適合做控制平面,而不是轉(zhuǎn)發(fā)平面。
? 解決思路:減少中間路徑,最簡單有效的方法就是bypass內(nèi)核。SRIOV的作用就是bypass宿主內(nèi)核。
? PF和VF:每個物理網(wǎng)卡(比如p1p1)就是一個PF,在開啟SRIOV后,每個PF可以生成固定數(shù)量的VF,每個VF都可以在宿主上作為一張網(wǎng)卡直接使用,或者直通到QEMU虛擬機里作為虛擬機里的網(wǎng)卡使用,這就實現(xiàn)了bypass宿主內(nèi)核。

先給出性能測試的結(jié)論,SRIOV VF直通相比傳統(tǒng)tap+bridge方案,性能提升:

? 發(fā)包轉(zhuǎn)發(fā)率提高: 677%
? 收包轉(zhuǎn)發(fā)率提高: 171%


2. 環(huán)境說明

機型:Dell PowerEdge R620
網(wǎng)卡:Intel X520(82599ES)
宿主OS:CentOS 7
VM OS:CentOS 7


3. 開啟SRIOV

1?? 在BIOS里開啟SRIOV,如圖所示

注:即使BIOS里開啟全局SRIOV,網(wǎng)卡也依然可以當作普通網(wǎng)卡使用

2?? 需要在BIOS里開啟VT-d

3?? grub配置iommu

iommu=pt intel_iommu=on

4. 生成VF
# 啟動網(wǎng)卡
ip link set p1p1 up

# 查看pf的pci編號
lshw -c network -businfo

# 查看網(wǎng)卡支持的vf數(shù)量
cat /sys/bus/pci/devices/0000:41:00.0/sriov_totalvfs

# 生成vf,建議加入開機啟動
echo 63 > /sys/bus/pci/devices/0000:41:00.0/sriov_numvfs

注意:若沒有屏蔽宿主的VF驅(qū)動,則在生成vf后還必須等待一會時間才能在宿主上看到所有命名完成的網(wǎng)卡(否則會看到一堆ethX網(wǎng)卡),vf數(shù)量越多需要等待時間越長,63個vf,差不多需要10秒


5. VF直通

如果qemu是通過libvirt管理的,有3種配置方法:

? 方法1(interface):在devices段落里加入


  
  
    

上面中address的地址,可以根據(jù)“l(fā)shw -c network -businfo”來配置,比如

pci@0000:41:10.0 p1p1_0

? 方法2(hostdev):在devices段落里加入


  
    

上面中address的地址,也是根據(jù)“l(fā)shw -c network -businfo”來配置

? 方法3(net-pool)

為每個PF網(wǎng)卡定義一個net-pool,即分別編輯一個xml文件。這里僅展示一個PF,編輯sriov-int.xml


  sriov-int
  
    
  

加入到libvirt net-pool、激活、并設(shè)置開機啟動

virsh net-define sriov-int.xml
virsh net-start sriov-int
virsh net-autostart sriov-int

雖然配置了net-autostart,但并不管用,因為物理機啟動時候,經(jīng)常會在啟動生成vf(假設(shè)在rc.local里生成vf)之前就啟動libvirt,而這個net-pool(sriov-int)本應(yīng)該在vf生成后才能啟動,因此建議在rc.local里增加如下內(nèi)容來確保啟動

ip link set p1p2 up
echo 63 > /sys/bus/pci/devices/0000:41:00.0/sriov_numvfs
virsh net-start sriov-int

然后,在vm的xml里增加


  
  
  
    
  

3種方法如何選擇

? 方法1:功能多,可以配置mac和vlan
? 方法2:mac和vlan需要自己在宿主上敲ip命令設(shè)置
? 方法3:有2個問題
? 存在一個bug,當本宿主所有vm使用某個PF的VF總數(shù)超過VF上限后,不會報錯,也能啟動,但是可能會有異常,并且vm如果被destroy關(guān)機,那么對應(yīng)的VF就會出問題,比如使用ip link set p1p1 vf 0 mac 00:00:00:00:00:00來做重置時候,會提示“RTNETLINK answers: Cannot allocate memory”,而且難以修復(fù),即使修復(fù),也不知道有沒有看不見的異常存在。
? 沒有辦法知道某個vm使用的是哪個vf,因此如果要對vf設(shè)置限速或者開關(guān)spoofchk時候,只能先在宿主上通過“ip link show dev p1p1 | grep MAC地址”方式來獲得vf號,然后才能設(shè)置限速等操作

綜上所述:使用方法3最便捷,但是存在bug,因此需要做好邏輯來防止vm使用vf總數(shù)超過上限的情況。


6. 開啟irqbalance

x520是2隊列,x710是4隊列,需要在vm里啟動中斷平衡服務(wù)(irqbalance),否則只會有一個cpu來處理數(shù)據(jù)包。

另外,這與宿主上vf的query_rss無關(guān)。


7. VM遷移

直通網(wǎng)卡屬于PCI設(shè)備,而libvirt和qemu卻不支持帶有非USB的PCI設(shè)備的vm做遷移,包括冷遷移和熱遷移。因此熱遷移無法實現(xiàn)。

冷遷移,有2種方案:

? detach掉vf網(wǎng)卡,然后使用libvirt做遷移,遷移過去后,再在新宿主上attach vf網(wǎng)卡
? undefine vm,然后在新宿主上重新渲染并define vm

注意:不能在vm關(guān)機時候用libvirt的遷移功能,有時候會導(dǎo)致虛擬機消失掉,包括原宿主和新宿主


8. 帶寬限速

只能限制出站帶寬,無法限制入站帶寬

ip link set p1p1 vf 0 max_tx_rate 100

表示出站帶寬限速100Mbps,不同網(wǎng)卡有差別:

? x520網(wǎng)卡最小限速11Mbps,限速10000Mbps,設(shè)為0表示不限速。若小于11或大于10000則會報錯
? x710網(wǎng)卡最小限速50Mbps,限速10000Mbps,設(shè)為0表示不限速。若小于50則自動設(shè)為50,若大于10000則會報錯

注意:vm關(guān)機后vf的帶寬限速不會復(fù)位


9. 安全

僅支持源mac過濾和網(wǎng)卡mac防篡改,不支持其他安全防護(防arp欺騙就無法實現(xiàn))

源mac過濾

ip link set p1p1 vf 0 spoofchk on

表示vm里發(fā)出的包,如果源mac不是指定mac,那么數(shù)據(jù)包不允許通過。注意:vm關(guān)機后vf的spoofchk不會復(fù)位

網(wǎng)卡mac防篡改

? 在宿主上修改mac,vm里的mac不會跟著改;在vm里修改mac,在宿主上可以看到變化
? 如果在vm關(guān)機狀態(tài)下改了mac地址,那么當vm開機后會改為vm的mac,當vm又關(guān)機后,又回改為原先改的mac
? 只有在宿主上看到的當前vf的mac為全0,才能在vm里修改mac地址,即使vf的spoofchk為off。但有一種例外,若使用上面方法2來配置xml,雖然宿主上看到的vf的mac不為0,但vm里可以修改
? 當在宿主上設(shè)置了mac后,虛擬機里的mac就無法篡改了
? 方法1(interface)來配置xml,估計vm啟動時候就自動幫忙在宿主上設(shè)置了mac,所以就直接實現(xiàn)了防篡改功能
? 方法2(hostdev)來配置xml,需要在宿主上手動再設(shè)置一次mac地址才能實現(xiàn)防篡改

在宿主上手動修改mac方法(vm關(guān)機和開機情況下都可以改):

ip link set p1p1 vf 0 mac aa:bb:cc:dd:ee:ff

建議:

? 在vm啟動前對vf做一次重置
? 在vm undefine后對vf做一次重置


10. 其他使用限制

? 直通到vm里的vf網(wǎng)卡里無法橋接到vm里的linux bridge,這也導(dǎo)致ebtables無法使用,iptables可以使用
? 直通到vm里的vf網(wǎng)卡可以加入ovs橋接
? 一個vm最多只能支持32個vf,超過數(shù)量會報錯


11. 性能測試

測試方法:

? 多臺vm同時發(fā)包,一臺vm收包,分別觀察發(fā)包性能和收包性能
? 發(fā)包vm在同一臺宿主上,收包vm在另一臺宿主上
? 測試工具:modprobe pktgen
? 測試包大小: udp包,size為64 bytes

配置:

? vm配置均為4核8G
? 物理網(wǎng)卡均為x520(vf隊列默認為2)
? 宿主和vm均開啟irqbalance、均關(guān)閉numad
? 不配置cpu綁定、不配置numa綁定
? 開啟大頁

測試結(jié)果:

測試結(jié)論:

使用SR-IOV+VF直通方式可以明顯提升包轉(zhuǎn)發(fā)率,1對1的測試結(jié)果看到kernel態(tài)發(fā)包可以達到3.5Mpps,收包可以達到1.9Mpps

? 發(fā)包比vxlan提高: 1196%,比vlan提高: 677%。此結(jié)果參考1對1(1個發(fā)包vm,1個收包vm)
? 收包比vxlan提高: 363%,比vlan提高: 171%。此結(jié)果參考3對1(3個發(fā)包vm,1個收包vm)

說明:

? kernel態(tài)單核數(shù)據(jù)包(64B)處理能力為2Mpps
? 2Mpps是因為kernel態(tài)瓶頸是2Mpps,如果通過dpdk走用戶態(tài),則可以大于2M,原因:收包端要將數(shù)據(jù)包中斷平衡到不同的cpu上,方法:可以通過多隊列方式,把每個隊列分配到單獨cpu上(irqbalance會自動均衡),然后source ip不一樣,就會對應(yīng)到不同隊列,也就是不同的中斷上。即1個VF,2個隊列,VM有至少2核,那么當符合負載均衡條件(mac、ip不同),則理論上可以達到4Mpps

更多測試結(jié)果:

以下測試使用的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)下,利用多隊列RSS中斷平衡提升吞吐率,會導(dǎo)致cpu非常高
? 用戶態(tài)下即使source mac或source ip固定,吞吐率基本接近限速14.8Mpps
? vxlan不能利用多核來提升吞吐,主要原因為外層source ip不夠多


12. windows虛擬機使用VF

到網(wǎng)卡官網(wǎng)下載對應(yīng)驅(qū)動并安裝,經(jīng)測試,win2012默認就有82599(x520)驅(qū)動,但版本舊


13. 運維命令
# 查看網(wǎng)卡支持的vf數(shù)量
cat /sys/bus/pci/devices/0000:41:00.0/sriov_totalvfs

# 宿主屏蔽VF驅(qū)動后查看vf和pf的對應(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)卡對應(yīng)哪個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ū)動
echo blacklist ixgbevf >> /etc/modprobe.d/blacklist.conf

表示當物理機啟動時候,默認不加載ixgbevf驅(qū)動,但是如果手動modprobe ixgbevf,則也會加載驅(qū)動。

如果當前已經(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ā)率測試方法

modprobe pktgen:發(fā)包通過pktgen來發(fā),收包通過sar -n DEV來看,發(fā)的是udp包

#!/bin/bash

NIC=eth2
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, eth3 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]

? 將腳本開頭的eth2改為發(fā)包對應(yīng)的網(wǎng)卡
? 將腳本開頭的192.168.1.2改為目標ip
? 將腳本開頭的52:54:00:43:99:65改為目標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

# sriov配置
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/virtualization_host_configuration_and_guest_installation_guide/sect-virtualization_host_configuration_and_guest_installation_guide-sr_iov-how_sr_iov_libvirt_works

# 線速
http://netoptimizer.blogspot.tw/2014/05/the-calculations-10gbits-wirespeed.html

文章題目:基于KVM的SRIOV直通配置及性能測試
文章路徑:http://weahome.cn/article/cpedsp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部