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模式的后端提供加速:

DPDK系列之六:qemu-kvm网络后端的加速技术_第1张图片

而通过使用OVS-DPDK,可以让虚拟机网络接口不变的情况下,享受宿主机使用DPDK快速通道带来的数据面速度提升。

DPDK系列之六:qemu-kvm网络后端的加速技术_第2张图片

但是更进一步,虚拟机里面也可以是运行DPDK,从而建立从虚拟机应用程序到宿主机网卡的基于DPDK的快速数据通路:

DPDK系列之六:qemu-kvm网络后端的加速技术_第3张图片

但是在宿主机是否开启OVS-DPDK以及虚拟机是否开启DPDK的组合中,性能存在如下组合关系:

DPDK系列之六:qemu-kvm网络后端的加速技术_第4张图片

而在虚拟机和容器混合部署的环境下,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





你可能感兴趣的:(DPDK,qemu,kvm,DPDK,qemu,KVM,DPDK系列)