嵌套虚拟化简介
嵌套虚拟化(nested virtualization、recursive virtualization)是指在虚拟化的客户机中运行一个Hypervisor,从而再虚拟化运行一个客户机。嵌套虚拟化不仅包括相同 Hypervisor的嵌套(如KVM on KVM、Xen on Xen、VMware on VMware等),也包括不同Hypervisor的相互嵌套(如VMware on KVM、KVM on Xen、Xen on KVM等)。根据嵌套虚拟化这个概念可知,不仅包括两层嵌套(如KVM on KVM),还包括多层的嵌套(如KVM on KVM on KVM)。
如果嵌套虚拟化比较成熟并商用了,在Amazon上的EC2或者Google的GCE上面租用的虚拟客户机中,就可以自己再使用VMware、KVM、Xen等虚拟机。
KVM嵌套虚拟化的当前状态(virtual EPT)
在两三年前(约2010年),KVM就开始支持嵌套虚拟化,可以向L1提供最基本的CPU硬件虚拟化。然后由于没有EPT的支持,在L1中只能使用 shadow pagetable,其内存访问的效率比较低;最近IBM和Intel(我们team)的工程师开始做一些virtual EPT的工作,可以让L1使用虚拟EPT的特性,从而极大地提高L2中内存访问的效率。有了virtual EPT之后,L2的pagetable就有3种可能的类型:shadow on shadow, shadow on EPT, EPT on EPT(其中EPT on EPT的性能当然是最好的)。目前,virtual EPT的patch还没发到upstream KVM中,不过最近应该可以很快进去了。
另外,最近IBM(和Intel)的工程师也在KVM maillist中发了一些关于VMCS shadowing的patch,这个也是可以很好地提高L2的运行效率的(今后可以再说说)。
BTW,在最新的Xen中,Intel工程师已经开发了virtual EPT 和 VMCS shadowing等nested中重要feature的patch,并且都已经正式加入到upstream中了的,貌似性能有很大的提高(今后可以有些数据)。也可以参考Xen Summit 2013中的一个演讲稿:http://www.slideshare.net/xen_com_mgr/nested-virtualization- update-from-intel
KVM virtual EPT的性能数据
在最新的KVM内核(3.9.0-RCx)中,添加了内部的virtual EPT相关的patch,然后在L2中测试kernel build的效率。(这里的嵌套虚拟化是 KVM on KVM 类型)
在一台Ivy Bridge机器上,L2是4 vCPU 和 4GB内存配置,内核编译所需的时间对比如下
without v-EPT: 32’6″ (32分6秒) –> 是shadow on EPT的情况。
with v-EPT: 9’56″ –> 是 EPT on EPT 的情况
可见,在KVM虚拟化中使用了virtual EPT的性能,可以让kernel build这个测试场景的性能变为原来的3倍(3X)左右。
相信在最近virtual EPT 和 VMCS shadowing 等patch都加入到upstream KVM中后,KVM的嵌套虚拟化效率会得到很大的提高,从而让嵌套虚拟化成为真正可实际使用的技术。