
云与虚拟化

内存虚拟化: 与虚拟内存的概念类似,一台主机上的每个虚拟机认为自己独占整个物理地址空间,因而需要对内存再做一次抽象,即内存虚拟化,保证每个虚拟机都有独立的地址空间。这样一来,在虚拟机和物理机中均有 VA 和 PA 的概念,即 GVA(Guest Virtual Address)和 GPA(Guest Physical Address),以及 HVA(Host Virtual Address)和 HPA(Host Physical Address)。虚拟机内的程序使用的是GVA,最终需要转换成 HPA。两个 VA 到 PA( GVA 到 GPA 以及 HVA 到 HPA)的映射同样使用页表管理,GPA 到 HVA 一般是几段连续的线性映射,由虚拟机的管理程序 VMM(Virtual Machine Monitor)进行管理。

进程访存需要从 VA 转换成 PA,在引入内存虚拟化后,转换路径发生了很大的变化。原本只需要将 VA 转换为 PA, 虚拟化后转换过程变成 GVA -> GPA -> HVA -> HPA 。路径变得更长更复杂之后,对于访存的安全和性能都带来了挑战,这两点也是内存虚拟化需要达到的 目标:1)安全 ,即地址转换的合法性,虚拟机不能访问不属于自己的内存;2)性能,即地址转换的高效性,包括转换关系建立的开销低,以及转换过程本身的开销低。
SPT: 由于最初的硬件只支持一层页表转换,直接用来转换虚拟机或物理机上的 VA 到 PA 都无法完成 GVA 到 HPA 的转换。因此 SPT 建立了一条捷径,即影子页表,直接管理 GVA 到 HPA 的映射,如下图所示。每一个影子页表实例对应虚拟机内一个进程,影子页表的建立需要 VMM 查询虚拟机内进程的页表。

由于影子页表管理的是 GVA 到 HPA 的直接映射,SPT 地址转换路径与物理机路径相当,直接查询一层页表就可以完成地址转换。在使用 4 级页表时,转换过程如下图所示。

2)影子页表本身需要占用内存,且一个影子页表只对应虚拟机内一个进程,整体会占用较多内存资源。

由于虚拟机内各级页表(gL4, gL3, gL2, gL1)内容只是 GPA,查询下一级时必须先经扩展页表(nL4, nL3, nL2, nL1)转换为 HPA,使得整个转换路径很长。在两层页表均为 4 级时,转换过程如
下图
所示。

劣势: 转换过程的开销很大,最坏情况下需要 24(4 + 4 + 4 * 4)次硬件查表转换。
两种经典的方案 在安全上都有坚实的保证,但在性能上各有缺陷。SPT 为保证地址转换的合法性在建立转换关系时付出了很大代价,而 EPT 虽然消除了建立转换关系的开销,转换路径却更长了。
1)一层页表方案。与 SPT 类似,使用一层页表直接管理 GVA 到 HPA 的映射;
2)两层页表方案。与 EPT 类似,使用两层独立页表分别管理 GVA 到 GPA 以及 GPA 到 HPA 的映射;
3)混合方案。结合前两类方案,进行动态的选择。


GPA 虽然不等于 HPA,但二者的映射关系十分简单,只需要 Direct Segment 硬件添加一个偏移,整个转换路径与物理机的路径相比差别很小,仅多了几次硬件偏移。虚拟机使用 4 级页表时,转换路径如下图所示,其中 DS 表示 GPA 到 HPA 转换的硬件支持。

优势: 地址转换关系的建立开销低,同时转换过程的开销也很低。
劣势:
1)需要硬件支持 GPA 到 HPA 分段映射,现有的硬件不具备这样的功能;
2)需要分配大段连续的内存,即主机不能有太多内存碎片。


TLB miss 率高于阈值 T1,Page Fault 频率低于阈值 T2 时,从 EPT 切换到 SPT
TLB miss 率低于阈值 T1,Page Fault 频率高于阈值 T2 时,从 SPT 切换到 EPT

一层页表显著的 优势 是地址转换过程开销低,与物理机相同,需要解决的问题是减少地址转换建立的开销。一个可能的方向是放弃一些安全性,让页表的修改更轻量;另一个更实际的方向是在合适的场景使用,即针对页表修改不频繁的负载使用。
两层页表的 优势 是地址转换建立的开销小,虚拟机可以独立修改页表,需要考虑的问题是缩短转换路径。这个方向其实可行性很高,但是依赖新硬件的支持,短期不太可能出现符合要求的新硬件。
混合页表的设计初衷是希望充分利用两类页表的优势,但是做好动态的模式切换是非常困难的,负载的差异甚至硬件的差异都可能影响切换的效果。或许针对已知负载做定向的调优是一个可行的方向。
我们是来自阿里云的操作系统团队,寻找有内核、虚拟化、容器、网络、存储、安全等系统技术经验,并有志于打造云原生底层系统的优秀人才,欢迎联系我们(邮箱:shaokang.hwd@alibaba-inc.com)。
加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】拉你入群;加入钉钉群:可扫码或搜钉钉群号(33311793)。欢迎开发者/用户加入龙蜥OpenAnolis社区交流,共同推进龙蜥社区的发展,一起打造一个活跃的、健康的开源操作系统生态!
关于龙蜥社区
龙蜥社区是由企事业单位、高等院校、科研单位、非营利性组织、个人等按照自愿、平等、开源、协作的基础上组成的非盈利性开源社区。龙蜥社区成立于2020年9月,旨在构建一个开源、中立、开放的Linux上游发行版社区及创新平台。
短期目标是开发Anolis OS作为CentOS替代版,重新构建一个兼容国际Linux主流厂商发行版。中长期目标是探索打造一个面向未来的操作系统,建立统一的开源操作系统生态,孵化创新开源项目,繁荣开源生态。
加入我们,一起打造面向未来的开源操作系统!
Https://openanolis.cn
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70004278/viewspace-2844184/ ,如需转载,请注明出处,否则将追究法律责任。