问题
操作系统内存管理器往往无法支持内存消耗大的应用程序。随着分离式内存和新内存技术的出现,以及万亿级机器学习模型、大规模图处理和其他内存密集型应用的出现,这个问题变得更加关键。
一个主要的系统瓶颈是内存管理和页面错误,而不是设备带宽[13]。因此,选择内存管理策略已成为一项针对具体情况的工作。例如,在数据中心的背景下,TMO[91]通过调整将内存卸载到SSD设备的内核策略,实现了20%的内存节省,而没有明显的性能损失。Canvas[90]为JVM引入了预取器;Semeru[89]修改了内核内交换系统,以支持JVM运行时分解;Dilos[95]展示了Redis的预取器[25]。但这些方法不适用于一般情况。先前的研究也强调了传统分页策略在分层内存系统中的无效性[33,76],从而导致了专门策略的发展。
以前解决内存管理的方法要么需要对内核进行大量修改[13,22,93],要么需要全新的内核架构[58,80]。Dilos[95]在其库操作系统中实现了预取,以规避内核分页堆栈的限制。FBMM[85]提出了VFS内核模块内的内存管理。但它们往往难以在现实世界的用例中实现和部署。先前的用户空间内存管理尝试存在重大缺陷,因为它们要么需要运行时支持[41,77,89],要么需要应用程序修改[30,88],要么是针对特定应用程序[56,81]或特定内存后端[76],要么会导致高开销[10,23,67,72]。
本文方法
本文提出了EXTMEM,为用户空间中基于应用程序的内存管理而设计的框架。将内存管理策略和分页机制的任务提升到了用户空间,允许内核将内存管理策略委托给用户空间的同时维护安全性和隔离性。同时在用户空间中提供了易于开发和快速测试的功能,为访问位和硬件计数器样本等指标提供数据收集模块。
-
基于用户级页面错误处理、内核信号和向上调用,将它们结合在一起,在现代Linux部署中实现定制的内存管理策略,其开销类似于内核内分页。
-
无需对应用程序代码进行任何修改,同时也使应用程序开发人员能够实现特定于应用程序的内存管理策略。开发人员可以将EXTMEM用于三个主要任务:开发和测试新的内存管理器,部署高度定制的内存管理器,获得对无服务器框架、垃圾收集器、数据库和数据密集型应用程序等软件工作内存的控制和可观察性。
-
考虑了广泛使用的Linux用户空间分页子系统userfailfd[10]的设计,该子系统依赖于基于文件的IPC和服务器线程来处理页面错误,因此对于多线程工作负载的扩展性较差。相比之下,EXTMEM基于向上调用,即使在高度多线程的环境中也允许可扩展的自分页[43]。
开源代码:https://github.com/SepehrDV2/ExtMem
总结
针对内存管理问题,本文提出了EXTMEM,为用户空间中的特定应用程序内存管理定制的多功能框架,将内存管理策略和分页机制提升到用户空间,同时维护安全性和隔离性。基于用户级页面错误处理、内核信号和向上调用,与Linux集成且开销类似于内核内分页,并保证多线程下高性能。便于开发人员由于:开发和测试内存管理器,部署定制的内存管理器,获得对应用程序工作内存的控制和可观察性。