赞
踩
目录
Linux内核支持多种虚拟化模式,并且支持的数量随着虚拟化的进步和新模式的出现(例如 lguest)而增加。但是,让这些虚拟化模式能够在 Linux 之上运行之后,又如何让它们能够在 I/O 虚拟化方面利用底层内核呢?
答案是使用virtio,它为 hypervisor 和一组通用的I/O虚拟化驱动程序提供高效的抽象。探索virtio并了解为什么 Linux将成为最佳的 hypervisor。
完全虚拟化中,guest OS运行于物理机器上的hypevisor上,guest OS并不知道它已被虚拟化,并且不需要任何更改就可以在该配置下工作。半虚拟化中,guest OS不仅知道它运行在hypervisor之上,还包含让guest OS更高效地过渡到hypervisor的代码。
在完全虚拟化模式中,hypervisor必须模拟设备硬件,它是在会话的最低级别进行模拟的。尽管在该抽象中模拟很干净,但它同时也是最低效、最复杂的。在半虚拟化的模式中,guest OS和hypervisor能够共同合作,让模拟更加高效。
在虚拟机中,可以通过qemu模拟e1000网卡,这样的经典网卡一般各种客户操作系统都会提供inbox驱动,所以从兼容性上来看,使用类似e1000的模拟网卡是一个非常不错的选择。
但是,e1000网卡上也包含了复杂的io端口,寄存器,缓存配置,虚拟机每次收发包都会引起更多的io和mmio操作,使得虚拟机频繁的陷出,最终导致网络性能不佳。
为了解决性能问题,IBM在2005年提出了virtio(PV Driver (事实上的标准)),虚拟机中的半虚拟化前端驱动和主机上的后端服务简单的使用virtqueue共享队列交换数据,大幅的减少了e1000模拟时复杂的io操作,从而可以较大程度的提升虚拟网络性能。
作为对比,从下面简单的iperf测试中,我们就能看出两者的性能差距:
vhost技术对virtio-net进行了优化,在内核中加入了vhost-net.ko模块,使得对网络数据可以再内核态得到处理。
virtio的io路径
vhost的io路径
vhost将部分virio驱动的操作从用户态移到内核态,减少了用户态/内核态切换时间和包的拷贝次数,从而更进一步的提升了性能,下面的网络延时测试可以看出vhost的优势:
随着技术的发展,将网络数据放入用户态处理将可以得到更灵活的形式。在原有的vhost架构中,进行了改动,增加了 一种新的vhost-backend,叫做vhost-user。
vhost的io路径
vhost-user的io路径
vhost-user的提交者是Luke Gorrie,他也是snabbswitch的作者。从图上可以看到vhost-backend从原来咋kernel中的vhost-net 变成了用户空间的snabbswitch。 snabbswitch直接接管物理网卡的驱动,从而直接控制网络信息的输入输出。
snabbswitch主要使用了下面的技术来提高性能
值得一提的是使用snabbswitch后,不用再使用原来的tap设备模拟的网卡。
使用vhost-user技术,从虚拟机到host上实现了数据的zero copy(通过大页共享),host到nic的zero copy(snabbswitch实现的驱动),能进一步加快数据的传输。
Vhost是client与kernel(server)的交互,client与内核共享内存,局限性是如果client要发送消息到用户进程,很不方便;
Vhost-user使用unix domain来进行通信,两个用户进程共享内存,达到和vhost一样的效果。
《Linux虚拟化KVM-Qemu分析(八)之virtio初探》
《Linux虚拟化KVM-Qemu分析(九)之virtio设备》
《使用DPDK打开Open vSwitch(OvS) *概述》
《《深入浅出DPDK》读书笔记(十五):DPDK应用篇(Open vSwitch(OVS)中的DPDK性能加速)》
《virtio 网络的演化:原始virtio > vhost-net(内核态) > vhost-user(DPDK) > vDPA》
站外参考文章
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。