KVM網絡性能調優

首先,我給你們看一張圖,這張圖是數據包從虛擬機開始而後最後到物理網卡的過程。
node

咱們分析下這張圖,虛擬機有數據包確定是先走虛擬機自身的那張虛擬網卡,而後發到中間的虛擬化層,再而後是傳到宿主機裏的內核網橋中,最後傳到物理網卡,這個過程很好理解。
那麼咱們要作網絡的優化,讓虛擬機的網絡運行得更加高效,咱們要想的就是讓虛擬機訪問到物理網卡的層次要少。或者說能不能讓宿主機的物理網卡直接丟給虛擬機用,這樣達到最高的網絡性能。linux

那麼目前KVM提升網絡性能這塊有如下四種方法:vim

  1. 使用virtio半虛擬化網卡
  2. 使用vhost_net
  3. 虛擬機網卡獨佔
  4. SRIOV技術

一、使用virtio半虛擬化網卡
首先要明確一點,那就是全虛擬化網卡的性能是不如半虛擬化網卡的,由於半虛擬化網卡virtio是使用了驅動進行改造了的,因此性能上確定是強過用戶態下的全虛擬化網卡。
網絡

這張圖能夠看出全虛擬化跟半虛擬化的區別

使用virtio 就是讓vm的數據包直接跟虛擬化層接觸,如上圖。架構

注意,Linux的內核是從2.6.24纔開始支持Virtio的。CentOS6系列都是支持的,咱們查看linux是否支持Virtio能夠經過下面這個命令查看:dom

[root@collber cobbler]# grep -i Virtio /boot/config-3.10.0-693.el7.x86_64 
CONFIG_VIRTIO_VSOCKETS=m
CONFIG_VIRTIO_VSOCKETS_COMMON=m
CONFIG_VIRTIO_BLK=m
CONFIG_SCSI_VIRTIO=m
CONFIG_VIRTIO_NET=m
CONFIG_VIRTIO_CONSOLE=m
CONFIG_HW_RANDOM_VIRTIO=m
CONFIG_DRM_VIRTIO_GPU=m
CONFIG_VIRTIO=m
# Virtio drivers
CONFIG_VIRTIO_PCI=m
CONFIG_VIRTIO_PCI_LEGACY=y
CONFIG_VIRTIO_BALLOON=m
CONFIG_VIRTIO_INPUT=m
# CONFIG_VIRTIO_MMIO is not set

Linux系統原生自帶就有,可是若是你的虛擬機是Windows,那麼得裝Virtio驅動。性能

若是你不指定,那麼虛擬機會默認使用8139的全虛擬化網卡,8139網卡是Realtek的百兆。測試

在實際的測試結果中使用virtio要比使用e1000或者rtl8139網絡吞吐性能要高出2倍左右,以下圖的測試數據就能夠看出,注意,藍色和綠色分別是全虛擬化下的8139和e1000,紅色的就是virtio模式;測試的數據差距確實很大。
優化

二、使用vhost_net
vhost-net是對於virtio的優化,在內核中加入了vhost-net.ko模塊,使得對網絡數據能夠在內核態獲得處理。
code

咱們能夠從這圖看到,數據包從虛擬網卡出來後,直接跳到了內核那一層中。這裏要注意的是,若是你要使用vhost-net那麼,你虛擬機的網卡類型必須是virtio的。
咱們要使用vhost-net,只要編輯虛擬機的XML文件,加入 便可

若是不使用vhost-net那麼把vhost變成qemu或者刪除這句話。

至於vhost-net跟virtio的區別,咱們能夠看紅帽官方文檔的解釋:

首先,咱們能夠從架構圖看到區別,vhost_net 下用戶態QEMU不參與數據包的發送了,虛擬機數據包直接進入內核態,減小了兩個空間內存拷貝和cpu的切換。這樣的好處就是圖中紅色框框裏說的那樣,能夠下降延遲以及提升CPU的使用率。可是這裏要注意一點的就是,若是虛擬機接收數據包的速度慢於宿主機發送的速度,那麼不建議使用vhost_net。

三、虛擬機網卡獨佔
虛擬機網卡獨佔,很簡單,就是說把宿主機的網卡直接配置給虛擬機使用,這樣,減小了中間的三個層次,如圖:

咱們能夠先用lspci命令查看宿主機pci網卡信息:

經過上面這個命令,咱們能夠發現宿主機有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'

本文轉自:http://www.sohu.com/a/140668189_610730

相關文章
相關標籤/搜索