《2017版:KVM網(wǎng)絡(luò)性能調(diào)優(yōu)終極版》要點(diǎn):
本文介紹了2017版:KVM網(wǎng)絡(luò)性能調(diào)優(yōu)終極版,希望對您有用。如果有疑問,可以聯(lián)系我們。
首先,我給大家看一張圖,這張圖是數(shù)據(jù)包從虛擬機(jī)開始然后最后到物理網(wǎng)卡的過程.
我們分析下這張圖,虛擬機(jī)有數(shù)據(jù)包肯定是先走虛擬機(jī)自身的那張?zhí)摂M網(wǎng)卡,然后發(fā)到中間的虛擬化層,再然后是傳到宿主機(jī)里的內(nèi)核網(wǎng)橋中,最后傳到物理網(wǎng)卡,這個過程很好理解.
那么我們要做網(wǎng)絡(luò)的優(yōu)化,讓虛擬機(jī)的網(wǎng)絡(luò)運(yùn)行得更加高效,我們要想的就是讓虛擬機(jī)訪問到物理網(wǎng)卡的層次要少.或者說能不能讓宿主機(jī)的物理網(wǎng)卡直接丟給虛擬機(jī)用,這樣達(dá)到最高的網(wǎng)絡(luò)性能.
那么目前KVM提高網(wǎng)絡(luò)性能這塊有以下四種方法:
1. 使用virtio半虛擬化網(wǎng)卡
2. 使用vhost_net
3. 虛擬機(jī)網(wǎng)卡獨(dú)占
4. SRIOV技術(shù)
首先要明確一點(diǎn),那就是全虛擬化網(wǎng)卡的性能是不如半虛擬化網(wǎng)卡的,因為半虛擬化網(wǎng)卡virtio是使用了驅(qū)動進(jìn)行改造了的,所以性能上肯定是強(qiáng)過用戶態(tài)下的全虛擬化網(wǎng)卡,這點(diǎn)我們在上一章講磁盤優(yōu)化的時候也提到過.
這張圖可以看出全虛擬化跟半虛擬化的區(qū)別
使用virtio 就是讓vm的數(shù)據(jù)包直接跟虛擬化層接觸,如上圖.
注意,Linux的內(nèi)核是從2.6.24才開始支持Virtio的.CentOS6系列都是支持的,我們查看linux是否支持Virtio可以通過下面這個命令查看:
grep?-i?Virtio?/boot/config-2.6.32-358.2.1.el6.x86_64 (演示的宿主機(jī)是CentOS7.1)
Linux系統(tǒng)原生自帶就有,但是如果你的虛擬機(jī)是Windows,那么得裝Virtio驅(qū)動.
那么下載Virtio驅(qū)動是在這個網(wǎng)址:
http://www.linux-kvm.org/page/WindowsGuestDrivers/Download_Drivers
使用Virtio,我們可以在創(chuàng)建虛擬機(jī)的時候在Virtual Machine Manager圖形界面里指定下:
當(dāng)然也可以編輯XML文件,添加<model?type=’virtio’/>
如果你不指定,那么虛擬機(jī)會默認(rèn)使用8139的全虛擬化網(wǎng)卡,8139網(wǎng)卡是Realtek的百兆.
在實(shí)際的測試結(jié)果中使用virtio要比使用e1000或者rtl8139網(wǎng)絡(luò)吞吐性能要高出2倍左右,如下圖的測試數(shù)據(jù)就可以看出,注意,藍(lán)色和綠色分別是全虛擬化下的8139和e1000,紅色的就是virtio模式;測試的數(shù)據(jù)差距確實(shí)很大.
vhost-net是對于virtio的優(yōu)化,在內(nèi)核中加入了vhost-net.ko模塊,使得對網(wǎng)絡(luò)數(shù)據(jù)可以在內(nèi)核態(tài)得到處理.
我們可以從這圖看到,數(shù)據(jù)包從虛擬網(wǎng)卡出來后,直接跳到了內(nèi)核那一層中.這里要注意的是,如果你要使用vhost-net那么,你虛擬機(jī)的網(wǎng)卡類型必須是virtio的.
我們要使用vhost-net,只要編輯虛擬機(jī)的XML文件,加入<driver?name=”vhost”/>即可
如果不使用vhost-net那么把vhost變成qemu或者刪除這句話.
至于vhost-net跟virtio的區(qū)別,我們可以看紅帽官方文檔的解釋:
首先,我們可以從架構(gòu)圖看到區(qū)別,vhost_net 下用戶態(tài)QEMU不參與數(shù)據(jù)包的發(fā)送了,虛擬機(jī)數(shù)據(jù)包直接進(jìn)入內(nèi)核態(tài),減少了兩個空間內(nèi)存拷貝和cpu的切換.這樣的好處就是圖中紅色框框里說的那樣,可以降低延遲以及提高CPU的使用率.但是這里要注意一點(diǎn)的就是,如果虛擬機(jī)接收數(shù)據(jù)包的速度慢于宿主機(jī)發(fā)送的速度,那么不建議使用vhost_net.
虛擬機(jī)網(wǎng)卡獨(dú)占,很簡單,就是說把宿主機(jī)的網(wǎng)卡直接配置給虛擬機(jī)使用,這樣,減少了中間的三個層次,如圖:
我們可以先用lspci命令查看宿主機(jī)pci網(wǎng)卡信息:
當(dāng)然,這里會顯示很多PCI設(shè)備,我們可以過濾下,只顯示網(wǎng)卡的PCI信息
# lspci?|?grep?Ethernet
通過上面這個命令,我們可以發(fā)現(xiàn)宿主機(jī)有4塊網(wǎng)卡(注意前面02:00.0的短標(biāo)識符信息,我們接下來會用到)
我們使用virsh?nodedev-list?–cap?pci命令也可以羅列出PCI設(shè)備列表
注意,我們可以通過上個圖中前面顯示的短標(biāo)識符(如02:00.0),找到下面對應(yīng)的PCI名稱(后面的02_00_0),如紅色框框所示:
然后我們可以再用virsh?nodedev-dumpxml + pci name得到PCI XML配置信息:
如:virsh?nodedev-dumpxml?pci_0000_02_00_0
OK,以上是PCI信息的查看,那么我們?nèi)绾伟裀CI網(wǎng)卡直接丟給虛擬機(jī)使用呢?接下來我們做以下配置即可:
首先你得確認(rèn)你的宿主機(jī)是否開啟了IOMMU服務(wù),CentOS7下默認(rèn)是不開啟的,我們用命令dmesg?|?grep?-iE?“dmar|iommu”可以先查看(執(zhí)行這個命令如果沒任何輸出,說明沒打開).然后我們修改vim?/etc/sysconfig/grub ,在GRUB_CMDLINE_LINUX那行添加intel_iommu=on(如果是intel平臺的話);再然后執(zhí)行g(shù)rub2-mkconfig?-o?/boot/grub2/grub.cfg生效,最后重啟系統(tǒng).
做完以上操作之后,我們就可以開始給虛擬機(jī)添加PCI設(shè)備了.
我們要關(guān)注的是PCI?XML信息里的以下四個:
<domain>0</domain>
<bus>2</bus>
<slot>0</slot>
<function>0</function>
有了這四個信息后,我們先把需要設(shè)置的VM進(jìn)行關(guān)機(jī),然后運(yùn)行virsh edit?vmname?進(jìn)行xml的修改.
我們在虛擬機(jī)的XML添加下面內(nèi)容:
<hostdev?mode=’subsystem’?type=’pci’?managed=’yes’>
<source>
<address?domain=’0′?bus=’2′?slot=’0′?function=’0′
作者:寶哥?云技術(shù)社區(qū)金牌作
文章來自微信公眾號:云技術(shù)實(shí)踐
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/4125.html