KVM嵌套虚拟化中使用virtual ETP特性

嵌套虚拟化的概念
嵌套虚拟化(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的嵌套虚拟化效率会得到很大的提高,从而让嵌套虚拟化成为真正可实际使用的技术。
(以上仅代表个人观点)

master

Stay hungry, stay foolish.

6 Comments

    • 估计3.10来不及加入这个了,3.11比较有希望。目前virtual EPT的patch正在发到KVM mailing list,但是由于还是有点复杂改动的地方比较多;KVM maintainer还没有完全接收,依然在一步一步的讨论、修改、测试~~

  1. kernel 3.13.6 貌似还是没加入EPT(Documentation/virtual/kvm/nested-vmx.txt文档里这么说的)
    kernel有个参数 kvm-intel.ept 默认将ept关闭了,是楼主所指的virtual EPT吗? 小白求解

    • kvm-intel.ept就是普通的EPT,我看代码中默认是打开的啊,你也可看:cat /sys/module/kvm_intel/parameters/ept 。
      看最新的linux,virutal EPT去年就加到kernel中的啊,具体patch是:http://markmail.org/message/t6urcdw64dzvpfcx 你可下载linx.git代码,用git log搜索nEPT关键词。

  2. 谢谢博主指点~
    # cat /usr/share/doc/kernel-doc-3.13.6/Documentation/kernel-parameters.txt 中说
    kvm-intel.ept [KVM,Intel] Disable extended page tables (virtualized MMU) support on capable Intel chips. Default is 1 (enabled)
    我想这是因为intel和amd的名称不同,所以kernel默认没有开启ept。(amd用kvm-amd.npt这个参数)
    另外,kvm_intel.so这个模块的帮助文档,我没有找到,不知bool与kernel参数描述的是否一致。

    • 如果是amd处理器,那肯定是不同的kvm module的;不过对于intel和amd两种x86架构,kvm的不少逻辑基本都是一致的。文档的话不太多的,可在kernel的Documentation目录中去找了,也可以自己看看代码,如果是一些kvm基础方面的东西,可以参考我写的那本书(本博客网站提到的) :-)

发表评论

电子邮件地址不会被公开。 必填项已用*标注