KVM 缺陷:
当然,优点自不用说了。像因为是完全虚拟化,所以不用修改客户OS. 另外是内核中支持的,能充分的利用Linux本身的进程调度等特性。在内存方面呢,因为有了Intel_EPT特性的支持,内存虚拟化也还不错。
而缺点呢:都知道,对于IO的虚拟化就不太够了,虽然有了QEMU这个强大的模拟软件,但是效率不是太理想。于是乎,出现了virtio这个Linux上的设备驱动标准框架。
首先,让我们来分析下QEMU虚拟IO的原理:
-----------当客户机的设备驱动程序发起IO请求时,KVM中的IO操作会拦截这次IO,然后在本次处理之后将本次IO请求的信息存放到共享页,并通知用户空间的QEMU。
-----------QEMU模拟程序获得IO操作信息之后,交由硬件模拟代码模拟出本次的IO操作。完成之后,将结果放回在共享页中,并通知KVM模块中的IO操作捕获代码。
-----------最后KVM将信息返回给客户机。
由此可见,KVM IO是连接客户机和QEMU的中间件。
这样我们做个总结:
QEMU的优点是可以模拟出各种很老很金典的设备,而且不需要修改Guest Os。 缺点是每次IO操作的路径很长,需要多次上下文切换,性能较差.
如何优化: Virtio出现了
Virtio,是一个在Hypervisor之上的抽象API接口,让客户机知道自己运行在虚拟机中,这样类似于半虚拟化。
内部结构上分为两部分,前端驱动是客户机中存在的驱动程序,而后端处理是在QEMU中实现。virtio是一层虚拟队列接口,它利用某种协议将前端和后端进行通信。这样可以达到与原生硬件差不多的性能。
当然,也是有缺陷的,因为必须要让客户机安装特定的virtio驱动让它知道是运行在虚拟化环境中的,并且要按照virtio的规定格式传输。
这样使用Virtio兼容性则不太好,并且IO频繁的时候CPU得使用率较高。
再来一神器 :设备直接分配(VT-d)
这种方式将宿主机中的PCI物理设备直接分配给客户机完全使用。 KVM虚拟机支持将宿主机的PCI PCIE设备附加到虚拟化的客户机中,从而让客户机依独占的方式访问这个PCI.这样客户机对设备的IO交互则不怎么需要KVM或者Hypervisor的参与了。
优点是提高了IO性能,减少了Virtio 中CPU的消耗。缺点是硬件有限,也不适合动态迁移。
没完了,设备直接分配给多个客户机(SR-IOV):