KVM總結-KVM性能優化之網絡性能優化


前面已經介紹了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提高網絡性能這塊有以下四種方法:

  1. 使用virtio半虛擬化網卡
  2. 使用vhost_net
  3. 虛擬機網卡獨占
  4. 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技術

原作者沒有寫 %>_<%

轉載自雲技術實踐微信公眾號,作者寶哥。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM