600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 持久化内存挑战PERSISTENT MEMORY CHALLENGES

持久化内存挑战PERSISTENT MEMORY CHALLENGES

时间:2020-01-14 05:39:21

相关推荐

持久化内存挑战PERSISTENT MEMORY CHALLENGES

持久化内存挑战

翻译自论文:Memory Management Techniques for Large-Scale Persistent-Main-Memory Systems

Storage Class Memory (SCM) 带来的独特机遇带来了一系列新的编程挑战:

(1) data consistency 数据一致性;

(2) 数据恢复 data recovery;

(3) persistent memory leaks 持久性内存泄漏;

(4) partial writes 部分写入;

(5) persistent memory fragmentation 持久化内存碎片;

(6) virtual address space fragmentation虚拟地址空间碎片化。

我们将在下面详细介绍这些挑战。

1、Data consistency

SCM 使用支持 SCM 的文件系统进行管理,该系统允许应用层通过内存映射直接访问 SCM。这使 CPU 能够通过加载(Load)和存储(store)语义直接访问 SCM。如图 1 所示,从 SCM 到 CPU 寄存器的路径很长并且大部分是易失性的。它包括store buffers、CPU caches和memory controller buffers,软件几乎无法控制所有这些缓冲区。此外,现代 CPU 实现了复杂的无序执行(out-of-order execution)和partial store ordering(Intel x86)或relaxed-memory ordering(IBM PowerPC)。因此,内存存储需要明确排序和持久化以确保一致性。当前的 x86 CPU 提供 CLFLUSH、MFENCE、SFENCE 和non-temporal store指令来强制执行内存排序和数据持久性。此外,CLFLUSHOPT 和 CLWB :CLFLUSH 同步驱逐cache line并将其写回内存。因此,数据需要与cache line边界对齐,以避免错误地意外驱逐共享的数据。 SFENCE 是一个内存屏障,它序列化所有挂起的store,而 MFENCE 序列化挂起的load和store。Non-temporal stores通过写入特殊buffer来绕过cache,该buffer在已满或发出 SFENCE 时被逐出。 CLFLUSHOPT 是 CLFLUSH 的异步版本,需要一个 MFENCE 进行序列化。最后,CLWB 将cache line写回内存而不将其驱逐,这在数据持久化后不久被访问时很有用。

图一 Volatility chain in x86-like CPUs

直到最近,memory controller buffers才被认为是易失性链的一部分。 从那时起,英特尔宣布在所有支持持久化内存的平台中支持Asynchronous DRAM Self-Refresh (ADR)。 ADR 使用电容器保护memory controller buffers中仍待处理的数据免受电源故障的影响。 因此,可以安全地假设cache line 刷新保证持久性。

2、Data recovery

当程序重启时,它会丢失其先前的地址空间,从而使存储的虚拟指针无效。 因此,需要设计发现和恢复存储在 SCM 中的数据的方法。 在 SCM 之上使用文件系统提供了一种在重新启动后发现数据的方法。

读取和写入由 SCM-aware文件系统创建的文件和内存映射是通过直接加载和存储指令进行的。 因此,SCM-aware文件系统不应对应用程序产生负面性能影响。 最先进的数据恢复技术是使用文件 ID 和相对于该文件的偏移量形式的持久指针。

3、persistent memory leaks

与易失性内存相比,内存泄漏给持久化内存带来了更大的问题。 此外,持久化内存面临着由软件故障导致的一类新的内存泄漏。 例如:考虑链表(linked-list)插入,如果在分配新节点之后但在链接到前一个节点之前发生崩溃,persistent allocator会记住分配,而数据结构不会,从而导致持久化内存泄漏。(被分配出去的内存,但是是无法被使用的)

4、partial writes

将 p-atomic store定义为在单个 CPU 周期内执行的存储;也就是说,一个不受部分写入影响的存储。 当前的 x86 CPU 仅支持 8 字节 p-atomic存储;较大的写入操作易出现部分写入,因为 CPU 可能随时推测性地驱逐cache line。 例如,如果一个线程正在写入 64 字节cache-line对其的字符串,它可能会写入 16 字节,然后被取消descheduled。 同时,CPU 可能会驱逐字符串所在的cache line,保留写入的前 16 个字节。 此时的故障将破坏 SCM 中的字符串。 解决此问题的常用方法是使用flag来来指示较大的写入操作是否已完成达到p-atomic目的。

5、persistent memory fragmentation

持久化内存分配比transient内存分配具有更长的生命周期,因此对整个应用程序的影响更大。虽然重启是对易失性(volatile)内存进行碎片整理的有效的最后的手段,但它在持久内存的情况下无效。这与文件系统的问题类似。然而,文件系统碎片整理解决方案不能应用于 SCM,因为文件系统有一个额外的间接步骤:它们使用虚拟内存映射和 DRAM 中的buffer pages,这使它们能够透明地移动物理页面来解决碎片化内存。(这是什么意思???)相反地,持久内存映射提供应用层的直接的对物理内存访问,而无需在 DRAM 中进行buffer。因此,持久内存不能透明地移动,因为它绑定到它的内存映射。因此,避免碎片是任何持久内存分配器的核心要求。

6、virtual address space fragmentation

鉴于存在具有数十TB主存的系统,并且目前软件和硬件支持的地址空间数量有限,预计 SCM 支持的更大主存容量将对地址空间碎片带来前所未有的挑战。事实上,SCM 支持数百 TB 的主内存容量。当前的 Intel x86 处理器使用48 位地址空间,最大容量为 256 TB。然而,Linux 只使用47位,因为一位是为内核保留的。因此,Linux 目前最多支持 128 TB 的地址空间。出现了以下两个挑战:这种容量对于使用 SCM 的下一代服务器来说是不够的,物理内存量接近可用虚拟地址空间的限制,使后者容易碎片化。因此,由于缺少足够大的连续虚拟内存区域,内存映射 SCM 中的文件可能会失败。为了解决这个问题,从 Linux 内核 v4.12 开始,页表将扩展到 5 级而不是 4 级,从而支持 128 PB 的虚拟地址空间。

从所有这些挑战中,得出以下对持久分配器的要求:提供数据发现和恢复机制,防止持久内存泄漏,并最大限度地减少碎片,甚至更好的是,提供碎片整理机制。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。