使用英特尔持久性内存编程简介

简介

多年以来,计算机应用在两层之间组织数据:内存和存储。新一代英特尔持久性内存基于英特尔和美光* 共同开发的突破性 3D XPoint™ 介质,推出了第 3 层。学习该技术,了解如何将它提供给应用以及持久性内存支持为何获得了如此积极的反响。

持久性内存技术支持开发兼具存储和内存属性的产品。产品具有存储的持久性,意味着它们将在重启后保留内容,它们可以像内存一样按字节寻址,意味着程序可以就地访问数据结构。

英特尔持久性内存技术能够脱颖而出的重要原因在于它的速度非常快,处理器可以直接访问,节省了传统存储停下来处理数据块 I/O 所需的时间。

优化系统互联

持久性内存令人激动不已的主要原因在于相比现有的存储设备,它能提供更高的性能。基于 NAND 的现代固态盘插入 PCIe* 总线,并使用 NVM Express* 协议通信,对比之下您会发现,它读取数据块的耗时为 80 微秒以上。下表的蓝色区域显示了多数时间用于访问介质。软件堆栈仅占总体访问时间的一小部分,我们可以尝试加快驱动程序的速度,但是不会取得明显的效果。

image of map
图 1: 应用延迟比较

英特尔® 傲腾™ 固态盘也可以使用 3D XPoint 技术插入 PCIe 总线,从而大幅减少了访问介质的时间,软件堆栈和 PCIe 协议的开销成为总体延迟的重要组成部分。为了充分利用 3D XPoint 技术,必须立即着手处理软件和互联的开销问题。此时,持久性内存隆重登场。

通过将介质连接至内存总线,CPU 可以直接访问数据,不需要任何驱动程序或 PCIe 开销。由于在 64 字节高速缓存行内访问内存,因此,CPU 只读取必要部分,不会模仿存储,将每次访问归拢为一个数据块大小。在图 1 中,您可以看到 64 字节读取的延迟非常低。

借助持久性内存,应用在内存和存储层基础上新增了一个数据放置层,持久性内存层的容量超过了 DRAM,相比存储,大幅提升了速度。应用能像使用传统内存一样,就地访问持久性内存驻留数据结构,无需在内存和存储之间反复传输数据块。

为了实现低延迟的直接访问,我们需要一个支持应用连接各种持久性内存的软件架构。

非易失性内存 (NVM) 编程模型

本文显示了高级别存储堆栈。构成堆栈的这些基本模块在几十年中没有太大变化。应用使用标准文件 API 打开文件系统内的文件,文件系统通过驱动程序或一系列驱动程序处理必要的数据块 I/O。所有存储访问均在数据块内实施,通常借助 PCIe 等互联。

image of map
图 2:存储堆栈

从操作系统的角度来看,基本文件 API(如打开/关闭以及读/写)支持已经存在了几十年。使用高级语言编写应用的开发人员可以借助提供更加方便的 API 的库进行编程。这些库最终将内部调用基本 API。

内存映射

Windows* 和 Linux* 均支持内存映射文件,这一特性在很久之前便已推出,但是并不常用。在持久性内存中,面向内存映射文件的 API 非常实用;实际上,它们是存储网络工业协会 (SNIA) 发布的持续性内存编程模型的核心。

打开文件后,内存才能映射文件,因此,应用调用 Windows 上的 CreateFileMappingMapViewOfFile 或 Linux 上的 mmap 之前,许可检查已经发生。

image of map
图 3:内存映射文件

调用产生后,文件出现在应用的地址空间内,支持对文件内容的加载/存储访问。存储指令引起的变化刷新至存储后,才能具有持久性,这是内存映射文件的一个重要方面。在 Windows 上,该步骤可借助 FlushViewOfFileFlushFileBuffers 完成;在 Linux 上,使用 msync 或 fsync。

在这种情况下,内存映射文件 API 的功能为持久性内存编程提供了极大优势。

持久性编程模型支持字节级访问插入内存总线的非易失性介质,此处通过常用的行业术语 NVDIMM 表示,它的全称是非易失性双列直插式内存模块。映射设置完成后,您会发现应用具有 MMU 虚拟到物理映射提供的直接访问。将这些直接映射配置到持久性内存的能力被称作直接访问 (DAX) 特性。普通文件系统和持久性内存感知型文件系统的不同之处在于对该特性的支持。DAX 目前受 Windows 和 Linux 支持。

image of map
图 4:持久性内存编程模型

NVM 库 (NVML) 简介

NVML 是一套开源库,适用于 Linux 和 Windows。如欲获取关于这些库的更多信息,请访问持久性内存编程网站 pmem.io。这些库通过高级别语言支持推进持久性内存编程的采用。目前,C 和 C++ 支持已经过全面验证,并在 Linux 上交付,并作为超前开发版本部署于 Windows。

flowchart
图 5: NVM 库

结论

持久性内存是一项颠覆性技术,本文描述的编程模型提供了访问这项新兴技术的方法。NVM 库提供交易操作支持,以保持数据的一致性和耐用性。该领域仍有许多未解之谜,将继续取得众多激动人心的进展。

如欲了解更多信息,请查看持久性内存编程视频系列。

有关编译器优化的更完整信息,请参阅优化通知