1. 程式人生 > >DPDK系列之六:qemu-kvm網路後端的加速技術

DPDK系列之六:qemu-kvm網路後端的加速技術

一、前言

在文章《DPDK系列之五:qemu-kvm網路簡介》中可以看到qemu-kvm為不同需求的虛擬機器提供了不同的網路方案,這些網路方案的效能最終都取決於位於宿主機上的網路backend的實現方式。本文對於不同的backend技術進行分析。

轉載自https://blog.csdn.net/cloudvtech

二、qemu-kvm網路後端加速

2.1 全模擬網絡卡

在最早的qemu的實現中,模擬了一個標準的e1000網絡卡,網路所有的行為都由qemu的服務程序進行模擬;但是虛擬機器在收發包的時候,需要guest進行io和mmio等操作,使得虛擬機器不斷進行ring級別的切換,效能損失嚴重。

2.2 virtio加速技術

為了解決全模擬網絡卡的效能缺陷,virtio技術得以發展,這個準虛擬化技術將前端模擬裝置virtio driver(如virtio-net)和宿主機上的後端服務virtio-backend通過virtqueue進行資料交換:

+---------+------+--------+----------+--+
|         +------+        +----------+  |
| user    |      |        |          |  |
| space   |      |        |  guest   |  |
|         |      |        |          |  |
|    +----+ qemu |        | +-+------+  |
|    |    |      |        | | virtio |  |
|    |    |      |        | | driver |  |
|    |    +------+        +-+---++---+  |
|    |                          |       |
|    |       ^                  |       |
|    v       |                  v       |
|            |                          |
+-+-----+-----------------+--+-------+--+
| |tap  |    +------------+ kvm.ko   |  |
| +-----+                 +--+-------+  |
|                kernel                 |
+---------------------------------------+

virtio技術減少了虛擬網絡卡的io操作,一定程度上提升了網路效能。但是從上圖可以看到virtio技術需要進出核心態的兩次切換開銷,效能還有提升空間。

2.3 vhost加速技術

vhost技術對virtio技術進行了進一步優化,引入vhost-backend,即將virtio-backend做成vhost-net.ko模組放置於核心中,有網路io請求的時候,KVM直接和這個核心模組進行通訊,進行一次使用者態到核心態的切換就可以完成資料傳輸,極大提升了虛擬網路效能:

+---------+------+--------+----------+--+
|         +------+        +----------+  |
| user    |      |        |          |  |
| space   |      |        |  guest   |  |
|         |      |        |          |  |
|         | qemu |        | +-+------+  |
|         |      |        | | virtio |  |
|         |      |        | | driver |  |
|         +------+        +-+---++---+  |
|                               |       |
|                               |       |
|                               v       |
|                                       |
+-+-----+---+-+----+------+----+--+-----+
| |tap  |   | vhost-net.ko|    | kvm.ko |
| +---^-+   +------+----^-+    +----+---+
|     |-------|  kernel |-----------|   |
+---------------------------------------+

2.4 vhost-user加速技術

隨著資料面加速技術如DPDK、大頁記憶體、處理器隔離等技術的引入,使用者態的網路資料處理能力得到了很大的提升,所以在vhost技術中又引入了使用者態的vhost-backend叫做vhost-user,這個後端和virtio-backend一樣執行在使用者態。在南北向通訊的時候,收發資料包也需要進出核心兩次,所不同的是vhost-user可以支援如大頁、零拷貝、NUMA local、CPU pin、DPDK眾多資料面優化技術來進一步加速虛擬機器資料包的收發路徑:

+---------------+------+--+----------+--+
|               +------+  +----------+  |
| user          |      |  |          |  |
| space         |      |  |  guest   |  |
|               |      |  |          |  |
|  +-+-------+  | qemu |  | +-+------+  |
|  | vhost   |  |      |  | | virtio |  |
|  | backend |  |      |  | | driver |  |
|  +---------+  +------+  +-+---++---+  |
|                               |       |
|      ^                        |       |
|      |                        v       |
|      |                                |
+------------------------------+--+-----+
|      +-----------------------+ kvm.ko |
|                              +--+-----+
|                kernel                 |
+---------------------------------------+

而在東西向通訊的時候,如果通訊的虛擬機器在同一個宿主機上,這直接可以通過vhost技術在使用者態進行通訊。

轉載自https://blog.csdn.net/cloudvtech

三、vhost-user使用DPDK加速

OVS可以和vhost-user一起工作,為基於bridge模式的後端提供加速:


而通過使用OVS-DPDK,可以讓虛擬機器網路介面不變的情況下,享受宿主機使用DPDK快速通道帶來的資料面速度提升。


但是更進一步,虛擬機器裡面也可以是執行DPDK,從而建立從虛擬機器應用程式到宿主機網絡卡的基於DPDK的快速資料通路:


但是在宿主機是否開啟OVS-DPDK以及虛擬機器是否開啟DPDK的組合中,效能存在如下組合關係:


而在虛擬機器和容器混合部署的環境下,DPDK與OVS的結合可以提供更加靈活的資料面加速方案。

/root/openvswitch-2.8.1/utilities/ovs-vsctl add-port br0 myportnameone -- set Interface myportnameone type=dpdkvhostuser options:dpdk-devargs=0000:02:06.0

/root/qemu-2.11.0/x86_64-softmmu/qemu-system-x86_64 -m 1024 -smp 1 -hda ./centos.qcow2 -boot c -enable-kvm -no-reboot -net none -nographic \
-chardev socket,id=char1,path=/usr/local/var/run/openvswitch/myportnameone \
-netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce \
-device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1 \
-object memory-backend-file,id=mem,size=1G,mem-path=/dev/hugepages,share=on \
-numa node,memdev=mem -mem-prealloc \
-vnc :1 --enable-kvm \
-netdev tap,id=tapnet,ifname=vnet0,script=no -device rtl8139,netdev=tapnet,mac=52:54:00:12:34:58

轉載自https://blog.csdn.net/cloudvtech