虚拟化IO笔记

IO虚拟化

相对于直接访问(direct pass-through)物理硬件的方法,基于软件的I/O虚拟化及管理具有更丰富的特性和更简化的管理方式。

1)全虚拟化的IO虚拟化
在全虚拟化,因为不修改Guest OS的内核,Guest OS保存了IO设备的原生驱动。但是VMM处理设备的方式会根据VMM位置的不同而有所不同。例如,全虚拟化最有代表性的VMware ESX,VMWare Workstation和QEMU-KVM的默认方式,由于VMM实现模式不同,采用的设备虚拟化方式也不同。
在VMware ESX中,VMM直接运行在物理硬件之上,直接操作硬件设备,而Guest OS看到的则是一组统一的虚拟IO设备。Guest OS对这些虚拟设备的每一个IO操作都会陷入VMM中,由VMM对IO指令进行解析并映射到实际的物理设备,然后直接控制硬件完成。
VMWare WorkStation和QEMU-KVM采用了不同的方式。VMM实际上运行在一个传统的操作系统之上,这类VMM无法获得对硬件资源的完全控制,因此采用软件模拟的方式来模拟IO设备。Guest OS的IO操作会被VMM捕获,并转发给宿主机(host OS)的一个用户态进程,该进程通过对宿主机操作系统的系统调用来模拟设备的行为。
模拟IO虚拟化方式的最大开销在于处理器模式的切换:包括从Guest OS到VMM的切换,以及从内核态的VMM到用户态的IO模拟进程之间的切换。
在这里插入图片描述

具体应用QEMU-KVM过程:
Start:虚拟机通过VM exit将CPU控制权返回给VMM,从而陷入到root模式下的ring0内的VMM,进行“陷入模拟”。
1.客户机的设备驱动程序发起I/O请求操作请求,KVM模块中的I/O操作捕获代码拦截这次I/O请求。
2.经过处理后将本次I/O请求的信息放到I/O共享页(sharing page),并通知用户空间的QEMU程序。
3.QEMU程序获得I/O操作的具体信息之后,交由硬件模拟代码来模拟出本次I/O操作,并调用内核中的硬件驱动把IO请求发送到物理硬件。
4.完成之后,QEMU将结果放回I/O共享页,并通知KMV模块中的I/O操作捕获代码。
5.KVM模块的捕获代码读取I/O共享页中的操作结果,并把结果放回客户机。
End:通过VM entry,guest再次获得CPU控制权,根据IO返回的结果进行处理。
注:
1.在这个操作中,客户机作为一个qemu进程在等待I/O时有可能被阻塞;
2.VMM和guest的IO信息共享不光IO共享页一种,还可以使用DMA。QEMU不把IO结果放到IO共享页中,而是通过DMA将结果直接写到guest的内存中去,然后通过KVM模块告诉客户机DMA操作已经完成。

2)半虚拟化的IO虚拟化
针对 I/O 全虚拟化纯软件模拟性能不高这一点,I/O 半虚拟化前进了一步。它提供了一种机制,使得 Guest 端与 Host 端可以建立连接,直接通信,摒弃了截获模拟这种方式,从而获得较高的性能,如Virtio。
在半虚拟化的情况下,修改Guest OS的内核,将原生的设备驱动从Guest OS移出,放到一个特殊的设备虚拟机中(对xen来说,就是Dom 0了),其余虚拟机中的IO请求都由设备虚拟机处理。而在Guest
OS内部,为每个虚拟设备安装一个特殊的驱动程序,由该驱动程序负责IO请求的传递,设备虚拟机经过VMM授权,解析收到的请求并映射到实际物理设备,最后交给设备的原生驱动来完成IO。实际上在这种情况下,Guest OS的驱动是消息代理的作用,把IO事件转换为消息,发送给设备虚拟机处理。
在这里插入图片描述

具体应用:
Virtio:
Virtio 是一种 I/O 半虚拟化解决方案,是一套通用 I/O 设备虚拟化的程序,是对半虚拟化 Hypervisor 中的一组通用 I/O 设备的抽象。提供了一套上层应用与各 Hypervisor 虚拟化设备(KVM,Xen,VMware等)之间的通信框架和编程接口,减少跨平台所带来的兼容性问题,大大提高驱动程序开发效率。客户机中可能有一些老的Linux系统不支持Virtio和主流的Windows系统需要安装特定的驱动才支持Virtio。
KVM/QEMU的Virtio实现采用在Guest OS内核中安装前端驱动(Front-end driver)和在QEMU中实现后端驱动(Back-end)的方式。前后端驱动通过vring(上图中的环形缓冲)直接通信,这就绕过了经过KVM内核模块的过程,达到提高I/O性能的目的。
Virtio可以分为四层,包括前端guest中各种驱动程序模块,后端Hypervisor(实现在Qemu上)上的处理程序模块,中间用于前后端通信的Virtio层和Virtio-ring层,Virtio这一层实现的是虚拟队列接口,算是前后端通信的桥梁,而Virtio-ring则是该桥梁的具体实现,它实现了两个环形缓冲区,分别用于保存前端驱动程序和后端处理程序执行的信息(保存的的只是事件相关信息,而不是全虚拟化中的需要传递的数据数据)。严格来说,Virtio和Virtio-ring可以看做是一层,Virtio层属于控制层,负责前后端之间的通知机制(kick,notify)和控制流程,而Virtio-vring则负责具体数据流转发。
在这里插入图片描述
在这里插入图片描述

另:
纯软件模拟的设备和Virtio设备(PCI设备,即网卡等硬件)的区别:Virtio省去了纯模拟模式下的异常捕获环节,Guest OS可以和QEMU的I/O模块直接通信;Virtio减少了虚拟机的退出和数据拷贝,能够极大地提高IO性能。

假设guest要向host发送数据,首先guest通过函数Virtqueue_add_buf将存有数据的 buffer 添加到Virtqueue中,然后调用Virtqueue_kick函数,Virtqueue_kick调用Virtqueue_notify函数,通过写入寄存器的方式来通知到host。host调用Virtqueue_get_buf来获取Virtqueue中收到的数据。

Vhost:

Virtio 在宿主机中的后端处理程序(backend)一般是由用户空间的QEMU提供的,然而如果对于网络 I/O 请求的后端处理能够在在内核空间来完成,则效率会更高,会提高网络吞吐量和减少网络延迟。在比较新的内核中有一个叫做 “Vhost-net” 的驱动模块,它是作为一个内核级别的后端处理程序,将Virtio-net的后端处理任务放到内核空间中执行,减少内核空间到用户空间的切换,从而提高效率。vhost技术对Virtio-net进行了优化,在内核中加入了vhost-net.ko模块,使得对网络数据可以再内核态得到处理。
在这里插入图片描述
Virtio的io路径
1.guest设置好tx;
2. kick host;
3. guest陷出到kvm;
4.kvm从内核切换到用户态的qemu进程;
5.qemu将tx数据投递到tap设备;。
vhost的io路径
1.guest设置好tx;
2.kick host;
3.guest陷出到kvm;
4.vhost-net将tx数据投递到tap设备;
vhost将部分virtio驱动的操作从用户态移到内核态,减少了用户态/内核态切换时间和包的拷贝次数,从而更进一步的提升了性能。

vhost-user:
vhost-user和vhost类似,只是使用一个用户态进程vhost-user代替了内核中的vhost模块。vhost-user进程和Guset之间时通过共享内存的方式进行数据操作。vhost-user相对与vhost架构,把Virtio后端驱动从内核态又放回到了用户态中(vhost-user进程充当Virtio后端驱动)。
在这里插入图片描述
vhost-user的io路径
1.guest设置好tx;
2.kick host;
3.guest陷出到kvm;
4.kvm将通知snabb;
5.snabb将tx数据直接发送到nic设备。

3)IO直通技术
上面两种虚拟化方式,还是从软件层面上来实现,性能自然不会太好。最好的提高性能的方式还是从硬件上来解决。如果让虚拟机独占一个物理设备,像宿主机一样使用物理设备,那无疑性能是最好的。
I/O直通技术就是完成这样一件事的。它通过硬件的辅助可以让虚拟机直接访问物理设备,而不需要通过VMM或被VMM所截获。
由于多个虚拟机直接访问物理设备,会涉及到内存的访问,而内存又是共享的,那怎么来隔离各个虚拟机对内存的访问呢,这里就要用到一门技术——IOMMU,简单说,IOMMU就是用来隔离虚拟机对内存资源访问的。
I/O直通技术需要硬件支持才能完成,这方面首选是Intel的VT-d技术,它通过对芯片级的改造来达到这样的要求,这种方式固然对性能有着质的提升,不需要修改操作系统,移植性也好。
但该方式也是有一定限制的,这种方式仅限于物理资源丰富的机器,因为这种方式仅仅能满足一个设备分配给一个虚拟机,一旦一个设备被虚拟机占用了,其他虚拟机时无法使用该设备的。(解决方案:SR-IOV)

更多可参考:
https://blog.csdn.net/joneslee/article/details/100092526

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值