前面已經介紹了KVM CPU優化(http://blog.csdn.net/dylloveyou/article/details/71169463)、內存優化(http://blog.csdn.net/dylloveyou/article/details/71338378)、磁盤IO優化(http://blog.csdn.net/dylloveyou/article/details/71515880),下面繼續介紹網絡性能調優。
首先,我給大家看一張圖,這張圖是數據包從虛擬機開始然后最后到物理網卡的過程。
我們分析下這張圖,虛擬機有數據包肯定是先走虛擬機自身的那張虛擬網卡,然后發到中間的虛擬化層,再然后是傳到宿主機里的內核網橋中,最后傳到物理網卡,這個過程很好理解。
那么我們要做網絡的優化,讓虛擬機的網絡運行得更加高效,我們要想的就是讓虛擬機訪問到物理網卡的層次要少。或者說能不能讓宿主機的物理網卡直接丟給虛擬機用,這樣達到最高的網絡性能。
那么目前KVM提高網絡性能這塊有以下四種方法:
- 使用virtio半虛擬化網卡
- 使用vhost_net
- 虛擬機網卡獨占
- SRIOV技術
使用virtio半虛擬化網卡
首先要明確一點,那就是全虛擬化網卡的性能是不如半虛擬化網卡的,因為半虛擬化網卡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
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
- 1
通過上面這個命令,我們可以發現宿主機有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>
- 1
- 2
- 3
- 4
有了這四個信息后,我們先把需要設置的VM進行關機,然后運行virsh edit vmname
進行xml的修改。
我們在虛擬機的XML添加下面內容:
<hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0' bus='2' slot='0' function='0' /> </source> </hostdev>
- 1
- 2
- 3
- 4
- 5
SRIOV技術
原作者沒有寫 %>_<%
轉載自雲技術實踐微信公眾號,作者寶哥。