NOMAD: Non-Exclusive Memory Tiering via Transactional Page Migration——论文泛读

OSDI 2024 Paper CXL论文阅读笔记整理

问题

随着可字节寻址存储设备的出现,如CXL内存、持久内存和存储类内存,分层存储系统已成为现实,不同层具有不同的特性,如速度、大小、功耗和成本。分层内存管理的核心是操作系统(OS)内的页面管理,包括页面分配、放置和迁移。页面迁移旨在将热数据放入快速内存,以优化数据访问的性能,同时使用慢速内存来容纳从快速内存溢出的数据。虽然现有的研究已经证明了页面迁移的有效性,但没有解决一个基本问题:独占内存分层,即页面要么存在于快速内存中,要么存在于慢速内存中,但不能同时存在于两者中,这是分层内存管理的最佳策略吗?

传统上,内存层次结构由性能相差至少一个数量级的存储介质组成。例如DRAM和磁盘,延迟、带宽和容量相差2-3个数量级。因此,页面管理的唯一目标是保持热页面,并最大限度地提高性能层(DRAM)的命中率,并将冷页面迁移(驱逐)到容量层(磁盘)。随着新的内存设备的出现,内存层次结构中的性能差距缩小,如英特尔Optane持久内存[56]和CXL内存[50],相比与DRAM只有2-3x的延迟和带宽差距。因此,如果迁移成本太高,将热页面提升到性能层将不再有益,对于容量层上的热页面,直接访问页面并避免迁移到性能层可能是更好的选择。

现有方法局限性

Nimble[54]通过利用透明大页面(THP)、页面的多线程迁移和多个页面的并发迁移来改进页面迁移。

透明页面放置(TPP)[44]扩展了Linux中现有的NUMA平衡方案,以支持快速和慢速内存之间的异步页面降级和同步页面升级。

Memtis[37]和TMTS[24]使用硬件性能计数器来减轻页面访问跟踪的开销,并使用后台线程定期异步地升级页面。

但现有方法面临两个限制:

  • 现有的分层内存页面管理假设内存层是互斥的,热页面被分配或迁移到性能层,冷页面被降级到容量层,每个页面只存在于一个层中。由于内存分层试图探索性能和容量之间的权衡,当工作负载的工作集大小超过了性能层的容量,且性能层不足以容纳热数据时,独占内存分层不可避免地会导致过度的冷热页面交换或内存抖动。

  • 缺乏有效的页面迁移机制来支持分层内存管理。未来的内存层预计可由CPU寻址,页面迁移类似于处理页面错误,涉及三个步骤:1)从页表中取消映射页面;2) 将页面内容复制到不同的层;3) 在页表上重新映射页,指向新的内存地址。无论页面迁移是同步还是在异步完成,迁移过程都是昂贵的。在迁移过程中,用户程序无法访问未映射的页面。如果频繁进行页面迁移,例如由于内存抖动,用户感知的带宽(包括对迁移页面的访问)明显低于峰值内存带宽(最多低95%)[54]。

    如图1,配置16GB快速内存(本地DRAM)和16GB慢速内存(远程CXL内存),测试工作集大小(WSS)(程序在执行过程中主动使用的内存量)小于和大于快速内存的情况。图2,测试原因在于同步页面迁移和页面错误处理。

本文方法

本文证明,当快速内存受到压力时,基于页面迁移的独占内存分层会导致性能显著下降。因此提出了非独占内存分层,允许性能层的部分页在容量层有副本,以减轻内存抖动。与包容性分层不同,包容性分层严格使用性能层作为容量层的缓存。最重要的好处是,在内存压力下,如果页面不脏并且其副本存在于容量层上,页面降级只需重新映射页面,从而降低页面降级的成本,实现平稳的性能转换。

提出了事务性页面迁移(TPM),在迁移过程中实现页面访问的机制。TPM在不从容量层取消页面映射的情况下启动页面内容复制,以便用户程序仍然可以访问迁移页面。将页面内容复制到性能层上的新页面后,TPM会检查该页面在迁移过程中是否被修改。如果修改,则页面迁移无效,复制的页面将被丢弃,并稍后重试。如果成功,复制的新页面将映射到页表中,旧页面取消映射,成为新页面的影子副本。

提出了NOMAD,一种针对分层内存的页面管理框架,集成了非独占内存分层和事务性页面迁移。NOMAD保护页面分配,以防止由于影子页面导致的内存不足(OOM)。当容量层面临内存压力时,NOMAD会优先回收影子页面,随后驱逐普通页面。将页面迁移从程序执行的关键路径中删除,并使迁移完全异步。

经过微基准测试和实际应用程序的评估表明,在内存抖动期间,NOMAD比TPP方法实现高达6倍的性能提升。还将NOMAD与最近提出的基于硬件辅助访问采样的页面迁移方法(Memtis)进行了比较,当工作集大小适合快速内存时,其性能始终比Memtis高出130%。

实验

实验环境:

Platform B:基于FPGA的CXL内存,调整后读延迟约为210ns,本地内存读延迟约为64ns。

Platform D:上市前的CXL内存,读延迟约为192ns,本地内存读延迟约为105s。

总结

针对使用基于CXL的内存时,分层内存的页管理策略。现有方法将页从容量层迁移到性能层时,受限于同步处理页面错误的开销,迁移过程中性能显著下降。本文提出非独占内存分层,允许性能层的部分页在容量层有副本,以减轻内存抖动。提出了事务性页面迁移(TPM),在迁移过程中页面可以访问。在不从容量层取消页面映射的情况下启动页面内容复制,以便程序仍然可以访问迁移页面。将页面复制到性能层上的新页面后,检查该页面是否被修改。如果修改,则页面迁移无效,并稍后重试;如果成功,将新页面将映射到页表中,旧页面取消映射,成为新页面的影子副本。页面降级时,如何页面不脏并且其副本存在于容量层,只需重新映射页面,实现平稳的性能转换。进一步实现NOMAD,针对分层内存的页面管理框架,集成了非独占内存分层和事务性页面迁移,防止由于影子页面导致的内存不足(OOM)。将页面迁移从程序执行的关键路径中删除,并使迁移完全异步。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 02:44:01       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 02:44:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 02:44:01       45 阅读
  4. Python语言-面向对象

    2024-07-20 02:44:01       55 阅读

热门阅读

  1. 大模型日报 2024-07-19

    2024-07-20 02:44:01       17 阅读
  2. Vant组件库的按需导入和导出

    2024-07-20 02:44:01       18 阅读
  3. UDP checksum calculation

    2024-07-20 02:44:01       21 阅读
  4. 设计模式总结

    2024-07-20 02:44:01       19 阅读
  5. Android gradle groovy改为kotlin总结

    2024-07-20 02:44:01       16 阅读
  6. 大模型日报 2024-07-18

    2024-07-20 02:44:01       16 阅读
  7. SpringBoot如何限制请求访问次数

    2024-07-20 02:44:01       17 阅读
  8. CSS简介

    2024-07-20 02:44:01       16 阅读
  9. C++ STL is_partitioned 用法和实现

    2024-07-20 02:44:01       16 阅读