ATC 2024 Paper 论文阅读笔记整理
问题
CXL这样的新内存技术实现了多种内存配置,如分层内存、远内存和内存处理。为了支持这些新的硬件配置,需要对操作系统进行大量修改。例如,Meta的TPP内核补丁对NUMA和页面回收策略进行了更改,对22个内核文件进行更改以实现分层内存系统[33]。然而,Linux的内存管理(MM)子系统使得为新的内存硬件添加软件支持变得更加困难:它是单一的,功能分布在数十个文件中,其中许多文件需要对每个扩展进行修改。
相比之下,文件系统和存储可以通过VFS和块层进行扩展,通过标准化的驱动程序接口进行驱动程序扩展,通过协议进行网络连接。这些组件都可以作为独立组件实现,而无需修改核心内核代码。
挑战
随着内存系统多样性和异构性的增加,操作系统内存管理必须具有可扩展性,以应对需求的快速增长。包括以下四个目标:
-
表达性:可扩展性接口必须允许表达各种各样的MM行为。
-
透明度:未经修改的应用程序应该能够使用MM扩展。
-
控制:高级应用程序需要为特定区域指定内存行为。
-
非侵入性:实施不应要求对现有的MM代码进行大量更改。
本文方法
本文使用Linux虚拟文件系统(VFS)提供的内存管理回调来编写内存管理器,称为内存管理文件系统(MFS),而不是为内存管理器创建一个全新的可扩展接口。通过在MFS的装载目录中创建和映射文件来分配内存,并通过删除文件来释放内存,称为基于文件的内存管理(FBMM)。
-
表达性:VFS层提供的回调函数允许MFS控制如何处理MM事件,如页面错误。
-
透明度:在内核的内存管理系统中添加了一个小的填充层,通过创建内存支持的文件并将分配请求分配给特定文件,将mmap等MM系统调用透明地转换为文件操作。
-
控制:基于文件系统实现,文件系统为不同的MM实现提供了一种方便的命名机制。应用程序可以在MFS的装载目录中手动创建和映射文件,以提供特定内存区域所需的功能。
-
非侵入性:方法基于现有的VFS回调,只需要添加填隙层。
FBMM用于分层内存、连续分配和内存带宽分配,每个管理器包含500-1500行代码。使用FBMM是,MFS可以与内核分开编译,并在需要时动态加载。
开源代码:GitHub - multifacet/fbmm
实验测量了使用文件系统进行内存管理的开销,发现当分配单个页面时,开销小于8%,而当分配128个页面时,开销则小于0.1%。
总结
针对适应新内存硬件的内存管理系统,原始方法适应新硬件需要大量内核程序的修改。本文提出基于文件的内存管理(FBMM),使用Linux虚拟文件系统(VFS)提供的内存管理回调来编写内存管理器,将其独立为内存管理文件系统(MFS),通过在MFS的装载目录中创建和映射文件来分配内存,并通过删除文件来释放内存。通过拦截内存管理系统调用并转换为MFS中的文件系统操作,对应用程序透明。也支持应用程序在MFS的装载目录中手动创建和映射文件,以提供特定内存区域所需的功能。