是通过 Internet 经过多年的发展,提供动态可伸缩资源的计算模式已成为企业 IT 技术的重要支持。虚拟化是云计算的核心技术之一。将计算机抽象成多个逻辑计算机,即虚拟机。每台虚拟机都是一个单独安全的环境,可以运行不同的操作系统,不相互影响。
它给资源的使用和调度带来了极大的便利。云计算系统可以根据负载及时调度资源,确保应用和服务不会因资源不足而影响服务质量。然而,虚拟化也是有成本的,这给抽象的资源带来了性能损失,这也是虚拟化一直致力于解决的问题。
虚拟资源抽象可分为三部分:。其中,设备虚拟化可实现网络、存储等设备直接进入虚拟机,无性能损失;CPU 在硬件特性的支持下,虚拟化的普通指令性能与裸机相同;与裸机相比,内存虚拟化仍有很大差异,这是一个值得关注的问题。
说到内存虚拟化,我们必须提到虚拟内存的概念。早期的操作系统只有物理地址和有限的空间,在使用过程中必须小心,以避免覆盖其他过程中的内存。为了避免这个问题,虚拟内存的概念被抽象出来,以确保每个过程都有一个连续和独立的虚拟内存空间。直接通过过程 VA(Virtual Address)使用内存,CPU 访存时发出 VA 由硬件 MMU(Memory Management Unit)拦截并转换为 PA(Physical Address),VA 到 PA 用页表管理映射,MMU 页表将在转换过程中自动查询。
类似于虚拟内存的概念,主机上的每个虚拟机都认为它独占整个物理地址空间,所以它需要再次抽象内存,即内存虚拟化,以确保每个虚拟机都有一个独立的地址空间。这样,虚拟机和物理机都有 和 的概念,即 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,。在路径变得越来越复杂后,它挑战了访问存储的安全性和性能,这也是内存虚拟化所需要实现的:1)安全 ,即地址转换的合法性,虚拟机无法访问不属于自己的内存;2)性能,即地址转换的效率,包括建立转换关系的低成本和转换过程本身的低成本。
为了实现内存虚拟化的目标,内存虚拟化的目标,SPT(Shadow Page Table)和 EPT(Extended Page Table)这是两个典型的解决方案,也是最熟悉的解决方案。在讨论其他虚拟化解决方案之前,让我们以此为切入点,看看他们是如何工作的。
由于原始硬件只支持一层页面转换,直接用于转换虚拟机或物理机 VA 到 PA 都无法完成 GVA 到 HPA 的转换。因此 SPT 建立了直接管理影子页表的捷径 GVA 到 HPA 如下图所示。每个影子页表实例对应虚拟机中的一个过程,需要建立影子页表 VMM 查询虚拟机内进程页表。
因为影子页面管理 GVA 到 HPA 直接映射,SPT 地址转换路径等于物理机路径,地址转换可以通过直接查询一层页表来完成。正在使用中 4 转换过程如下图所示。
SPT 地址转换过程成本低,相当于物理机。
1)地址转换关系的建立成本很高。为了保证地址转换的合法性,所有的转换关系,即虚拟机过程的页面修改,都将被拦截并陷入特权 VMM 执行中代;
2)影子页面本身需要占用内存,一个影子页面只对应虚拟机中的一个过程,占用更多的内存资源。
后来的硬件增加了嵌套页表对虚拟化的支持,使硬件能够自动完成两层页表的转换。EPT 也就是说,基于硬件支持的管理中 GVA 到 GPA 在虚拟机页表的基础上,新扩展页表管理 GPA 到 HPA 映射,如下图所示。两层页面相互独立,两层映射关系转换由硬件自动完成。
虚拟机内各级页表(gL4, gL3, gL2, gL1)内容只是 GPA,在查询下一级时,必须先扩展页面(nL4, nL3, nL2, nL1)转换为 HPA,使整个转换路径非常长。两层页是 4 转换过程如等级所示。
建立地址转换关系成本低,独立 EPT 页面表的存在保证了地址转换的合法性,因此虚拟机的页面表可以自行修改而不需要 VMM 的干预。
转换过程的成本很大,最坏的情况下需要 24(4 4 4 * 4)二次硬件查表转换。
在安全方面有坚实的保证,但在性能缺陷。SPT 在建立转换关系时,为确保地址转换的合法性付出了巨大的代价 EPT 虽然消除了建立转换关系的费用,但转换路径更长。
内存虚拟化在业界和学术界还有很多探索,基本思想和 SPT 或 EPT 类似,可分为:
1)一层页面方案。 SPT 类似地,使用一层页面直接管理 GVA 到 HPA 的映射;
2)两层页面方案。 EPT 类似地,使用两层独立页表进行管理 GVA 到 GPA 以及 GPA 到 HPA 的映射;
3)混合方案。动态选择结合前两种方案。
一层页表方案,这是 Xen 当早期硬件只支持一层页面时,半虚拟化方案。相比于 SPT 最大的区别是没有单独的维护 GVA 到 GPA 的虚拟机页表,虚拟机知道自己处于虚拟化环境,即知道自己的页表内容是 HPA。虚拟机修改页表也需要陷出,但可以主动陷出 batch 化,而 SPT 被动拦截陷出;读取页表时只能得到 HPA,需要查一张 M2P(Machine to Physical)表才能得到 GPA。
Direct Paging 同样使用一层页管理 GVA 到 HPA 映射、地址转换的路径和路径 SPT 是一样的。在使用中 4 只需要最坏的页面 4 次查表。
地址转换过程成本低,相当于物理机。
建立地址转换关系的费用很大,所有页面修改都需要主动陷出;
2)虚拟机需要进行半虚拟化适应,虚拟机需要感知其页面管理 GVA 到 HPA 的映射。
学术界基于新硬件的两层页表方案。GVA 到 GPA 映射管理与 EPT 多级页表也是一样的。 GPA 到 HPA 采用分段机制, GPA 转换为 HPA 只需通过硬件添加偏移即可。
GPA 虽然不等于 HPA,但是两者的映射关系很简单,只需要 Direct Segment 硬件添加偏移,整个转换路径与物理机器的路径相差不大,硬件偏移只有几次。使用虚拟机 4 转换路径如下图所示。 DS 表示 GPA 到 HPA 硬件支持的转换。
建立地址转换关系成本低,转换过程成本低。
1)需要硬件支持 GPA 到 HPA 现有硬件不具备分段映射的功能;
2)需要分配大段连续内存,即主机不能有太多内存碎片。
学术界也提出了基于新硬件的两层页表方案。 EPT 非常相似,唯一的区别在于 EPT 管理 GPA 到 HPA 的使用多级页表,般是 4 级,每级 512 项;而 Flat EPT 使用仅有一级的扁平页表,表项远不止 512。
与 EPT 相同,虚拟机内各级页表的内容也是 GPA,查询下一级时需要先经过扁平扩展页表(nL4)转换为 HPA。由于扁平扩展页表只有一级,转换路径相比 EPT 缩短了非常多。在虚拟机内使用4级页表时,转换路径如下图所示,最坏只需 9(4 + 1 + 4 * 1)次查表。
地址转换关系的建立开销低,同时转换过程的开销也较低。相比于 Direct Segment 对内存分配要求很低,只需要少量连续内存用作扁平扩展页表即可(8G规格虚拟机只需要 16M)。
需要硬件支持扁平扩展页表,当前的硬件只支持表项为 512 的多级扩展页表。
Mix SPT and EPT:混合方案,这是学术界较早提出的方案,简单而言就是动态的分时切换 SPT 与 EPT。在虚拟机运行时监控和采集 TLB miss 与 Page Fault 的数据,在二者达到设定的阈值时进行 SPT 与 EPT 之间的切换,如:
TLB miss 率高于阈值 T1,Page Fault 频率低于阈值 T2 时,从 EPT 切换到 SPT
TLB miss 率低于阈值 T1,Page Fault 频率高于阈值 T2 时,从 SPT 切换到 EPT
有机会充分利用SPT与EPT的优势,达到更好的性能。
1)页表切换阈值的设定很困难,硬件配置都可能影响阈值;
2)SPT与EPT的切换也是有代价的,主要是SPT的销毁与重建。
一层页表显著的是地址转换过程开销低,与物理机相同,需要解决的问题是减少地址转换建立的开销。一个可能的方向是放弃一些安全性,让页表的修改更轻量;另一个更实际的方向是在合适的场景使用,即针对页表修改不频繁的负载使用。
两层页表的是地址转换建立的开销小,虚拟机可以独立修改页表,需要考虑的问题是缩短转换路径。这个方向其实可行性很高,但是依赖新硬件的支持,短期不太可能出现符合要求的新硬件。
混合页表的设计初衷是希望充分利用两类页表的优势,但是做好动态的模式切换是非常困难的,负载的差异甚至硬件的差异都可能影响切换的效果。或许针对已知负载做定向的调优是一个可行的方向。
长远来看,如果有新硬件的加持,两层页表(尤其是Flat EPT)是比较完善的方案,地址转换可以很高效,也不需要在安全和通用性上做一些牺牲。但是短期来看,新硬件为时尚早,在一层页表方案上做进一步的探索和优化,是更加实际的。我们将会持续在内存虚拟化这条路径探索更多的可能,欢迎大家加入 OpenAnolis 龙蜥社区讨论交流。
—— 完 ——
陶志恒(君川),2020年加入阿里云操作系统-云原生底层系统团队,目前从事性能优化方向的工作。
我们是来自阿里云的操作系统团队,寻找有内核、虚拟化、容器、网络、存储、安全等系统技术经验,并有志于打造云原生底层系统的优秀人才,欢迎联系我们(邮箱:shaokang.hwd@alibaba-inc.com)。
加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】拉你入群;加入钉钉群:可扫码或搜钉钉群号(33311793)。欢迎开发者/用户加入龙蜥OpenAnolis社区交流,共同推进龙蜥社区的发展,一起打造一个活跃的、健康的开源操作系统生态!
龙蜥社区_小龙
钉钉群二维码
龙蜥社区是由企事业单位、高等院校、科研单位、非营利性组织、个人等按照自愿、平等、开源、协作的基础上组成的非盈利性开源社区。龙蜥社区成立于2020年9月,旨在构建一个开源、中立、开放的Linux上游发行版社区及创新平台。
短期目标是开发Anolis OS作为CentOS替代版,重新构建一个兼容国际Linux主流厂商发行版。中长期目标是探索打造一个面向未来的操作系统,建立统一的开源操作系统生态,孵化创新开源项目,繁荣开源生态。
加入我们,一起打造面向未来的开源操作系统!
Https://openanolis.cn
1.关于龙蜥社区20个问题 | 龙蜥问答第1期
2.内核热补丁,真的安全么?| 龙蜥技术
3.龙蜥社区成立LoongArch SIG,发布龙芯版路线图
4.中国系统加入龙蜥社区,共建国际领先开源社区
戳“阅读原文”直达 OpenAnolis 龙蜥社区官网
https://openanolis.cn