当前位置: 首页 > Linux

致敬黑客:内存虚拟化探索盘点|龙蜥科技

时间:2023-04-06 05:07:39 Linux

云与虚拟化云计算是一种通过互联网服务提供动态可伸缩资源的计算模型。经过多年的发展,已经成为企业IT技术的一个重要方面。支持。虚拟化是云计算的核心技术之一。它将一台计算机抽象为多台逻辑计算机,即虚拟机。每个虚拟机都是一个独立且安全的环境,可以运行不同的操作系统而不会相互影响。虚拟化技术给资源的使用和调度带来了极大的便利。云计算系统可以根据负载情况及时调度资源,提高资源利用率的同时保证应用和服务不会因资源不足而影响服务质量。然而,虚拟化也是有代价的。资源的抽象带来性能损失,这也是虚拟化一直在努力解决的问题。虚拟化的资源抽象可以简单分为三个部分:CPU虚拟化、内存虚拟化、设备虚拟化。其中,设备虚拟化可以实现网络、存储等设备直连虚拟机,性能无损失;CPU虚拟化,在硬件特性的支持下,可以执行普通指令,性能与裸机相当;内存虚拟化仍然存在比裸机更大的问题。目前,差异是一个值得关注的问题。Memoryvirtualization虚拟内存:说到内存虚拟化,就不得不提到虚拟内存的概念。早期的操作系统只有物理地址和有限的空间,进程在使用内存时必须小心不要覆盖其他进程的内存。为了避免这个问题,抽象出虚拟内存的概念,保证每个进程都有一个连续独立的虚拟内存空间。进程通过VA(VirtualAddress)直接使用内存。CPU访问内存时发出的VA,被硬件MMU(内存管理单元)拦截,转换成PA(PhysicalAddress)。VA到PA的映射使用页表进行管理,MMU在转换页表时会自动查询。内存虚拟化:类似于虚拟内存的概念,一台主机上的每个虚拟机都认为自己拥有整个物理地址空间,所以需要对内存进行再次抽象,即内存虚拟化,保证每个虚拟机都拥有一个独立的地址空间。这样在虚拟机和物理机中都有VA和PA的概念,分别是GVA(GuestVirtualAddress)和GPA(GuestPhysicalAddress),还有HVA(HostVirtualAddress)和HPA(HostPhysicalAddress).虚拟机内部的程序使用GVA,最终需要转换为HPA。从两个VA到PA(GVA到GPA和HVA到HPA)的映射也是由页表管理的。GPA到HVA一般是几个连续的线性映射,由虚拟机管理程序VMM(VirtualMachineMonitor)管理。进程内存访问需要从VA转换为PA。引入内存虚拟化后,转换路径发生了很大变化。最初,只需将VA转换为PA。虚拟化后,转换过程变为GVA->GPA->HVA->HPA。路径变长、变复杂后,给内存访问的安全性和性能带来挑战。这两点也是内存虚拟化需要达到的目标:1)安全性,即地址转换的合法性,虚拟机无法访问属于自己的内存;2)性能,即地址转换的效率,包括建立转换关系的低开销和转换过程本身的低开销。经典方案为了达到内存虚拟化的目的,人们提出了很多虚拟化方案。SPT(ShadowPageTable)和EPT(ExtendedPageTable)是两种典型的方案,也是大家最熟悉的方案。让我们从这个开始,看看它们是如何工作的,然后再讨论其他虚拟化解决方案。SPT:由于原硬件只支持一层页表转换,因此不能直接在虚拟机或物理机上使用VA转PA完成GVA到HPA的转换。因此SPT建立了shortcut,影子页表,直接管理GVA到HPA的映射,如下图所示。每个影子页表实例对应虚拟机中的一个进程,影子页表的建立需要VMM查询虚拟机中进程的页表。由于影子页表管理的是GVA到HPA的直接映射,所以SPT地址转换路径相当于物理机路径,直接查询一层页表即可完成地址转换。使用4级页表时,转换过程如下图所示。优点:SPT地址转换过程开销小,与物理机相当。缺点:1)地址转换关系的建立代价高昂。为了保证地址转换的合法性,所有建立转换关系,即虚拟机进程页表的修改,都会被拦截,然后被困在特权VMM中执行;2)影子页表本身需要占用内存,而一个影子页表只对应虚拟机中的一个进程,整体上会占用较多的内存资源。EPT:后来硬件增加了对嵌套页表的支持,用于虚拟化,让硬件自动完成二级页表转换。EPT是一种基于硬件支持的解决方案。在管理GVA到GPA的虚拟机页表的基础上,增加了一个扩展页表来管理GPA到HPA的映射,如下图所示。两层页表相互独立,两层之间映射关系的转换由硬件自动完成。由于虚拟机中各级页表(gL4、gL3、gL2、gL1)的内容只是GPA,所以在查询下一级时,必须先通过扩展页表(nL4、nL3、nL2)转换为HPA,nL1),使得整个转化路径很长。当二级页表都在4级时,转换过程如下图所示。优点:地址转换关系的建立开销小,独立EPT页表的存在保证了地址转换的合法性,因此虚拟机的页表可以自行修改,无需VMM的干预。缺点:转换过程开销很大,最坏情况下需要24(4+4+4*4)次硬件查表转换。两种经典方案在安全性上都有坚实的保障,但在性能上却各有缺陷。SPT在建立翻译关系时付出大量金钱保证地址翻译的合法性,而EPT免去了建立翻译关系的开销,但翻译路径较长。其他探索业界和学术界对内存虚拟化还有很多探索。基本思想类似于SPT或EPT,可分为三类:1)一级页表方案。与SPT类似,使用一层页表直接管理GVA到HPA的映射;2)两层页表方案。与EPT类似,使用两个独立的页表分别管理GVA到GPA和GPA到HPA的映射;3)混合方案。结合前两种方案进行动态选择。DirectPaging:一级页表方案,是Xen早期硬件只支持一级页表时的一种半虚拟化方案。与SPT相比,最大的区别在于没有单独维护从GVA到GPA的虚拟机页表,虚拟机知道自己处于虚拟化环境中,即知道自己的页表内容是HPA。虚拟机在修改页表的时候也需要trap,但是主动trap的方式可以批量进行,而SPT则是被动拦截trap;读页表时,只能得到HPA,需要查一张M2P(MachinetoPhysical)表才能得到GPA。DirectPaging也使用了一层页表来管理GVA到HPA的映射,地址转换路径与SPT相同。使用4级页表时,最坏情况下只需要4次查表。优点:地址转换过程开销小,可与物理机媲美。缺点:1)地址转换关系的建立代价高昂,需要主动捕获所有页表修改;2)虚拟机需要适配半虚拟化,虚拟机需要意识到它的页表管理是从GVA到HPA的映射。DirectSegment:双层页表方案,是学术界提出的一种新的基于硬件的方案。GVA到GPA的映射管理和EPT一样,也是采用多级页表。但是GPA到HPA的映射采用了分段机制,在将GPA转换为HPA时,只需要通过硬件添加一个偏移量即可。虽然GPA不等于HPA,但是两者的映射关系很简单。它只需要在DirectSegment硬件上添加一个偏移量。整个转换路径和物理机的路径差别很小,只是多了几个硬件偏移。当虚拟机使用4级页表时,转换路径如下图所示,其中DS代表硬件支持GPA到HPA转换。优点:地址转换关系的建立开销小,转换过程的开销也小。缺点:1)硬件需要支持GPA到HPA的分段映射,现有硬件没有该功能;2)需要分配一大段连续的内存,即宿主机内存碎片不能太多。FlatEPT:Two-layerpagetablescheme,也是学术界提出的一种新的基于硬件的方案。整体和EPT很像,唯一不同的是EPT使用多级页表管理GPA到HPA,一般4级,每级512个表项;而FlatEPT使用的是只有一层的平面页表,条目数远远超过512个。和EPT一样,虚拟机中各级页表的内容也是GPA。查询下一级时,需要通过扁平化的扩展页表(nL4)转换为HPA。由于平面扩展页表只有一级,转换路径比EPT短得多。在虚拟机中使用4级页表时,转换路径如下图所示,最坏情况下只需要9(4+1+4*1)次查表。优点:地址转换关系的建立开销小,转换过程的开销也小。与DirectSegment相比,内存分配要求很低,只需要少量的连续内存来展平页表(8G虚拟机只需要16M)。缺点:硬件需要支持平面扩展页表。目前的硬件只支持512个表项的多级扩展页表。MixSPTandEPT:混合方案,学术界较早提出。简单的说就是SPT和EPT之间的动态分时切换。虚拟机运行时监控收集TLBmiss和PageFault数据,当两者达到设定阈值时在SPT和EPT之间切换,如下图:TLBmissrate高于阈值T1,PageFaultfrequency时低于阈值T2,从EPT切换到SPTTLBmiss率低于阈值T1,当PageFault频率高于阈值T2时,从SPT切换到EPT优势:有机会使full利用SPT和EPT的优点来获得更好的性能。缺点:1)页表切换阈值很难设置,硬件配置可能会影响阈值;2)SPT和EPT的切换也是有代价的,主要是SPT的销毁和重建。综上所述,一级页表的显着优点是地址转换过程的开销低,这点和物理机是一样的。需要解决的问题是减少地址转换建立的开销。一个可能的方向是放弃一些安全性,让页表的修改更轻;另一个更实际的方向是在合适的场景下使用它,即用于不经常修改页表的负载。两层页表的优点是地址转换的建立成本较低,虚拟机可以独立修改页表。需要考虑的问题是缩短翻译路径。这个方向其实是非常可行的,但是依靠新硬件的支持,短期内不太可能出现符合要求的新硬件。混合页表设计的初衷是为了充分利用两种页表的优点,但是做动态模式切换难度很大,负载的不同甚至硬件的不同都可能影响开关效果。或许对已知负载进行定向调整是一个可行的方向。从长远来看,在新硬件的支持下,两层页表(尤其是FlatEPT)是一个比较完善的解决方案。地址转换可以非常高效,并且无需牺牲安全性和通用性。但从短期来看,新硬件还为时过早,进一步探索和优化一级页表方案更具有现实意义。我们会在内存虚拟化的道路上不断探索更多的可能性,欢迎大家加入OpenAnolis社区一起讨论交流。——完——作者简介陶志恒(俊川),2020年加入阿里云操作系统-云原生底层系统团队,目前致力于性能优化方向。我们是阿里云的操作系统团队。我们正在寻找具有内核、虚拟化、容器、网络、存储、安全等系统技术经验,有志于构建云原生底层系统的优秀人才。欢迎联系我们(邮箱:shaokang.hwd@alibaba-inc.com)。加入龙蜥社区加入微信群:添加社区助手-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】拉你入群;加入钉钉群:扫描二维码或搜索钉钉群号(33311793)。欢迎广大开发者/用户加入DragonLizardOpenAnolis社区进行交流,共同推动DragonLizard社区的发展,共同打造活跃健康的开源操作系统生态!龙蜥社区_小龙钉钉群二维码关于龙蜥社区龙蜥社区由企事业单位、高等院校、科研单位、非营利组织、个人等在自愿、平等、开源、和协作的非营利性开源社区。DragonLizard社区成立于2020年9月,旨在打造一个开源、中立、开放的Linux上游发行社区和创新平台。短期目标是开发AnolisOS作为CentOS的替代版本,重建一个与国际主流Linux厂商兼容的发行版。中长期目标是探索打造面向未来的操作系统,建立统一的开源操作系统生态,孵化创新开源项目,繁荣开源生态。加入我们,共同打造面向未来的开源操作系统!