一、前言
在文章《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