论文要解决的核心问题:传统分层内存管理在面对新型硬件时的局限性
这篇论文关注的核心问题是:在现代计算机系统中使用新型内存设备(如CXL内存、持久内存)构建分层内存系统时,操作系统中现有的页面管理策略(特别是页迁移)效率低下,导致性能瓶颈,尤其是在快速内存资源受限的情况下。
具体来说,问题可以分解为以下几个方面:
-
内存硬件演进与性能差距缩小:
- 背景: 随着CXL内存、持久内存(PM)等字节可寻址(byte-addressable)内存设备的出现,未来的计算机系统将普遍拥有多层内存,每层具有不同的速度、容量、功耗和成本特性。
- 新挑战: 与过去DRAM和磁盘之间巨大的性能差距(2-3个数量级)不同,新型内存(如CXL内存和PM)与DRAM的性能差距大大缩小(通常在2-3倍以内)。这意味着传统操作系统中指导页管理设计的"巨大性能差距"假设不再成立。如果页迁移的开销过高,将热页提升到高性能层可能反而得不偿失。
-
独占式内存分层的固有缺陷(Exclusive Memory Tiering):
- 传统策略: 目前主流的分层内存管理(包括Linux中的TPP等)都采用"独占式"策略。这意味着一个数据页在任何时刻都只能存在于一个内存层:要么在快速内存(如DRAM),要么在慢速内存(如CXL内存/PM),不能同时存在。
- 问题所在:
- 内存压力下的性能下降: 当应用程序的工作集大小(WSS)超过快速内存的容量时,为了保持热数据在快速内存中,系统不得不频繁地在快速内存和慢速内存之间来回迁移(提升和降级)页面。这种频繁的数据移动导致**"内存颠簸"(memory thrashing)**,应用程序性能急剧下降,甚至比不进行任何迁移直接访问慢速内存还要差(如图1所示)。
- 数据冗余: 独占式策略虽然避免了数据冗余,但牺牲了性能稳定性。
-
现有页迁移机制的效率低下:
- 同步与阻塞: 操作系统中的页迁移是一个复杂且开销大的过程,通常包括解映射(unmap)、复制(copy)和重映射(remap)三个步骤。在迁移过程中,被迁移的页无法被用户程序访问。尤其是"同步页迁移"(synchronous migration),它会阻塞用户程序的执行,直到迁移完成,严重拖慢关键路径。例如,TPP在发现热页时会同步地进行页提升,导致大量的小页错误(minor page faults)和CPU时间消耗(如图2所示)。
- TLB Shootdown开销: 页表更新后,需要向所有可能缓存了旧页表项的CPU发送进程间中断(IPI),执行TLB shootdown来清除旧的TLB条目,这在多核系统中开销巨大。
- 追踪开销与准确性: 识别"热页"和"冷页"需要内存访问追踪。现有的软件追踪(如扫描页表、基于页错误)可能开销高或准确性不足;硬件辅助追踪(如PEBS)虽然开销低,但可能面临采样率与准确性的权衡,且可能无法准确识别所有热页(例如,频繁命中缓存的页)。
综上所述,论文认为,在新型分层内存的背景下,简单地沿用或优化现有的独占式、同步页迁移策略已经无法满足性能需求,需要一种根本性的改变。
论文提出的创新点:NOMAD框架及其核心机制
为了解决上述问题,论文提出了 NOMAD (Non-Exclusive Memory Tiering via Transactional Page Migration) 框架,其核心创新点在于:
-
非独占式内存分层(Non-Exclusive Memory Tiering):
- 核心思想: 放弃了传统独占式策略,允许一部分从慢速内存提升到快速内存的页,在慢速内存中保留一个"影子副本"(shadow copy)。这意味着在某些情况下,一个数据页可以同时存在于快慢两个内存层中。
- 具体实现与优势:
- 缓解内存颠簸: 当快速内存面临压力需要降级页时,如果该页在快速内存中的副本是干净的(未被修改),并且其在慢速内存中的影子副本存在,那么降级操作可以极大地简化。系统不再需要将数据从快速内存复制回慢速内存,而只需简单地通过修改页表来"重映射"到慢速内存中的影子副本。这大大降低了降级开销,使系统在内存压力下能更平滑地过渡性能,避免了昂贵的双向数据移动。
- "单向页影子": NOMAD的页影子是"单向"的,只针对从慢速内存提升到快速内存的页保留影子副本。这与完全的"包含式缓存"(Inclusive Caching)不同,后者通常将所有数据都视作慢速内存的缓存,并且可能导致更大的容量开销。
- 影子页管理: NOMAD引入了XArray数据结构来索引影子页,并使用一个特殊的"影子读写位"(shadow r/w bit)来追踪快速内存中主页的修改情况。如果主页被修改,其影子副本会被标记为不一致并最终丢弃,以避免数据不一致问题。
- 影子页回收: 为了避免因影子页占用过多内存而导致的OOM问题,NOMAD指示
kswapd(Linux的内存回收守护进程)优先回收影子页,并在内存分配失败时主动释放影子页。
-
事务性页迁移(Transactional Page Migration, TPM):
- 核心思想: 将页内容复制过程与页的可用性解耦,使得页在大部分迁移过程中仍然可以被用户程序访问,从而将页迁移从关键路径中移除,使其成为异步操作。
- 具体实现与优势(如图3所示):
- 无阻塞复制: 与传统迁移先解映射后复制不同,TPM在开始复制页内容时,并不立即解映射页。它会清除页的脏位,并向所有CPU发送TLB shootdown,确保后续的写入可以被追踪。在此期间,用户程序仍然可以从慢速内存中访问该页。
- 事务性保证: 复制完成后,TPM会检查页的脏位。如果页在复制期间被用户程序修改(即脏位被设置),则本次迁移(事务)被视为失败并中止,复制的页内容被丢弃,待稍后重试。如果页是干净的,则在锁定该页并进行一次TLB shootdown后,将其在页表中重映射到快速内存的新地址,完成迁移。
- 最小化不可访问时间: 页真正不可访问的时间窗口被极大地缩短,仅限于页表项更新和TLB shootdown的那一小段时间,而非整个数据复制过程。
- 异步特性: TPM可以在后台由内核线程
kpromote异步执行,与用户程序并行,大大降低了对用户程序性能的影响。 - 优化与Linux内存追踪的结合(如图4所示): TPM通过维护一个"提升候选队列"(PCQ),并与Linux现有的LRU列表管理结合,力求在减少页错误数量(在理想情况下每个页迁移只需一个页错误)的同时,有效地启动页迁移。
总结来说:
- 解决的问题: 传统独占式、同步的页迁移机制在新型分层内存系统中效率低下,尤其是在快速内存不足时导致严重的内存颠簸和性能下降。
- 创新点:
- 非独占式内存分层: 允许在慢速内存中保留热页的影子副本,极大地降低了内存压力下页降级的开销,提高了系统在面对内存压力时的鲁棒性和性能稳定性。
- 事务性页迁移: 通过异步、无阻塞的页内容复制和事务性提交机制,将页迁移从用户程序的关键路径中移除,显著减少了迁移对应用程序性能的冲击。
NOMAD通过这些创新点,旨在为分层内存系统提供一个更高效、更稳定的页管理框架,从而更好地利用不同内存层的特性,提升整体系统性能。