天天看點

KVM網絡性能調優

本文介紹KVM網絡性能調優

首先,我給大家看一張圖,這張圖是資料包從虛拟機開始然後最後到實體網卡的過程。

KVM網絡性能調優

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

那麼我們要做網絡的優化,讓虛拟機的網絡運作得更加高效,我們要想的就是讓虛拟機通路到實體網卡的層次要少。或者說能不能讓主控端的實體網卡直接丢給虛拟機用,這樣達到最高的網絡性能。

那麼目前KVM提高網絡性能這塊有以下四種方法:

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

1、使用virtio半虛拟化網卡

首先要明确一點,那就是全虛拟化網卡的性能是不如半虛拟化網卡的,因為半虛拟化網卡virtio是使用了驅動進行改造了的,是以性能上肯定是強過使用者态下的全虛拟化網卡。

KVM網絡性能調優

這張圖可以看出全虛拟化跟半虛拟化的差別

KVM網絡性能調優

使用virtio 就是讓vm的資料包直接跟虛拟化層接觸,如上圖。

注意,Linux的核心是從2.6.24才開始支援Virtio的。CentOS6系列都是支援的,我們檢視linux是否支援Virtio可以通過下面這個指令檢視:

[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模式;測試的資料差距确實很大。

KVM網絡性能調優

2、使用vhost_net

vhost-net是對于virtio的優化,在核心中加入了vhost-net.ko子產品,使得對網絡資料可以在核心态得到處理。

我們可以從這圖看到,資料包從虛拟網卡出來後,直接跳到了核心那一層中。這裡要注意的是,如果你要使用vhost-net那麼,你虛拟機的網卡類型必須是virtio的。

我們要使用vhost-net,隻要編輯虛拟機的XML檔案,加入即可

KVM網絡性能調優

如果不使用vhost-net那麼把vhost變成qemu或者删除這句話。

至于vhost-net跟virtio的差別,我們可以看紅帽官方文檔的解釋:

KVM網絡性能調優

首先,我們可以從架構圖看到差別,vhost_net 下使用者态QEMU不參與資料包的發送了,虛拟機資料包直接進入核心态,減少了兩個空間記憶體拷貝和cpu的切換。這樣的好處就是圖中紅色框框裡說的那樣,可以降低延遲以及提高CPU的使用率。但是這裡要注意一點的就是,如果虛拟機接收資料包的速度慢于主控端發送的速度,那麼不建議使用vhost_net。

3、虛拟機網卡獨占

虛拟機網卡獨占,很簡單,就是說把主控端的網卡直接配置給虛拟機使用,這樣,減少了中間的三個層次,如圖:

KVM網絡性能調優

我們可以先用lspci指令檢視主控端pci網卡資訊:

KVM網絡性能調優

通過上面這個指令,我們可以發現主控端有4塊網卡(注意前面02:00.0的短辨別符資訊,我們接下來會用到)

我們使用virsh nodedev-list --cap pci指令也可以羅列出PCI裝置清單

注意,我們可以通過上個圖中前面顯示的短辨別符(如02:00.0),找到下面對應的PCI名稱(後面的02_00_0),如紅色框框所示:

KVM網絡性能調優

然後我們可以再用virsh nodedev-dumpxml + pci name得到PCI XML配置資訊:

如:virsh nodedev-dumpxml pci_0000_02_00_0

KVM網絡性能調優

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