1. 程式人生 > >KVM總結-KVM效能優化之網路效能優化

KVM總結-KVM效能優化之網路效能優化

首先,我給大家看一張圖,這張圖是資料包從虛擬機器開始然後最後到物理網絡卡的過程。
這裡寫圖片描述

我們分析下這張圖,虛擬機器有資料包肯定是先走虛擬機器自身的那張虛擬網絡卡,然後發到中間的虛擬化層,再然後是傳到宿主機裡的核心網橋中,最後傳到物理網絡卡,這個過程很好理解。

那麼我們要做網路的優化,讓虛擬機器的網路執行得更加高效,我們要想的就是讓虛擬機器訪問到物理網絡卡的層次要少。或者說能不能讓宿主機的物理網絡卡直接丟給虛擬機器用,這樣達到最高的網路效能。

那麼目前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,我們可以在建立虛擬機器的時候在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

這裡寫圖片描述

通過上面這個命令,我們可以發現宿主機有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' /> 
    </source> 
</hostdev> 

SRIOV技術

原作者沒有寫 %>_<%

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