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