【Pmem】持久内存介绍及访问模式总结

Intel于 2019 年 4 月发布了傲腾持久性内存(Optane DC persistent memory),这是目前市场上唯一商用的持久性内存(Pmem)存储设备。同时也在操作系统层面开发了一系列用于管理Pmem的工具,提供了丰富完备的文档。Pmem官方网站
但是Intel于2022年11月结束傲腾业务,但是承诺在已经卖出去的傲腾内存生命周期内,仍然维护PMDK。公告:PMDK 更新和我们的长期支持策略
就是虽然傲腾Pmem基本上已经算是寄了,但是对于新型的CXL扩展内存设备而言,在操作系统层面的支持与管理还是有参考价值。下面简单介绍一下傲腾Pmem及其可配置的两种访问模式:Memory mode(内存模式)App Direct mode(应用直接访问模式)

文章目录

  • 一、Pmem概述
  • 二、内存模式
  • 三、应用直接访问模式(APP Direct)
    • 1. 持久内存用作块存储
    • 2. 持久内存直接访问(DAX机制)
      • 内存映射文件mmap机制
    • 3. 傲腾持久性内存的命名空间
  • 四、针对Pmem的一些Benchmark

一、Pmem概述

持久性内存(persistent memory,Pmem)能够像磁盘一样持久地存储数据,具有接近 DRAM 的性能,同时还能提供远高于 DRAM 的存储密度。Pmem通过内存总线 与 CPU 互连,CPU 可以按字节粒度访问 Pmem。也就是说Pmem将传统外存的大容量持久存储与传统内存的低延迟字节寻址能力相结合。

经典的计算机存储器层次结构是由易失性内存(包括处理器缓存、DRAM 等)和持久性外存(包括机械磁盘、固态硬盘等)构成。
【Pmem】持久内存介绍及访问模式总结_第1张图片

图引自:陈游旻. 持久性内存存储系统关键技术研究[D].清华大学,2021.DOI:10.27266/d.cnki.gqhau.2021.000070.

在如图1.2所示的存储金字塔中,存储层级越高,其距离处理器越近,容量越小、访问速度越高, 单位容量价格也就越贵。相变存储器(phase change memory,PCM)、3D XPoint等新型持久性内存的出现则打破了上述存储层级。持久性内存像 DRAM 一样通过内存总线与处理器直接相连,处理器可以通过内存指令按字节粒度访问持久性内存,且访问延迟与 DRAM 十分接近。另外,持久性内存还能像外存设备一样持久地存储数据,即使在系统掉电时数据也不会丢失。因此,持久性内存属于全新的一个存储层级。

  • 在硬件层面:傲腾持久内存是NVDIMM-P的可商用实现,有关NVDIMM可见:【CXL】cxl-cli、ndctl、daxctl管理linux内核中NVDIMM设备子系统。其内部的持久化存储技术是3D XPoint技术,具体细节好像没有公开,不过可以在《持久内存架构与工程实践 (李志明等 著)》第二章找到一些有关如何持久化存储的相关内容。

  • 在操作系统层面,其实这块有点乱,理了挺久,勉强有点眉目。商用的傲腾持久内存可配置两种访问模式:内存模式和App Direct模式。在App Dirdect模式下给Pmem部署文件系统后应该又可以将Pmem用作块存储(类似传统外存)和直接访问内存(类似传统内存)。现在的大部分研究基本都是聚焦在App Direct模式。
    【Pmem】持久内存介绍及访问模式总结_第2张图片
    这是操作系统管理Pmem的模型图,后续进行说明。

图引自:张佳辰,胡泽瑞,赵盛,施文杰,王刚,刘晓光.VMFS:一种持久性内存统一管理系统[J].电子学报,2021,49(12):2299-2306.

二、内存模式

【Pmem】持久内存介绍及访问模式总结_第3张图片

内存模式:连接在同一个集成内存控制器上的DRAM 会作为持久内存的缓存工作。

该模式下DRAM无法直接访问,而是作为持久内存在直接映射缓存策略下的可写回缓存,持久内存作为大容量易失内存使用。

  • DRAM作为缓存命中时,性能可以与DRAM相当;

  • 但是不命中时,开销为DRAM的访问开销加上持久内存的访问开销。

其最大的优势是用户程序不需要经过任何修改可直接运行,应用没有移植成本。

三、应用直接访问模式(APP Direct)

App Direct 模式:持久内存作为可持久化的存储设备使用,该模式下持久内存和相邻的DRAM都会被识别为操作系统可见的内存设备,持久内存是与DRAM分离的持久化设备,DRAM则用作主存储器。

持久内存上部署文件系统后,其访问时间比常规存储设备(如SSD)的访问时间短得多。

其缺点是,用户需要使用相应的编程模型规范对持久内存进行应用程序的编程,会有代码修改的人力成本。

【Pmem】持久内存介绍及访问模式总结_第4张图片

图引自:陈游旻. 持久性内存存储系统关键技术研究[D].清华大学,2021.DOI:10.27266/d.cnki.gqhau.2021.000070.

1. 持久内存用作块存储

【Pmem】持久内存介绍及访问模式总结_第5张图片

该访问方式包括红框所圈的三个途径:
【Pmem】持久内存介绍及访问模式总结_第6张图片
Linux 4.3 及更高的版本已经默认支持 NVDIMM 驱动,该驱动可以将持久性内存以设备的形式呈现给用户(例如/dev/pmem0)。

  • 最左边的访问线:应用程序可以直接打开上述设备,然后在裸设备上通过读写接口访问持久性内存空间;
  • 左二的线:程序员亦可在该设备上部署传统文件系统,然后通过标准文件接口访问持久性内存空间。
    值得注意的是,裸设备访问没有任何一致性保障,其存储的数据存在掉电丢失、不一致的风
    险,而通过传统文件系统访问则要忍受额外的软件开销,性能损耗比较严重。
  • 左三的线:在设备上部署支持持久内存感知的文件系统,包括Linux ext4和XFS,以及Windows NTFS等。可以以左二的线相同的方式,即标准文件API访问,如open、read、write等。

2. 持久内存直接访问(DAX机制)

【Pmem】持久内存介绍及访问模式总结_第7张图片
包括红框所圈的一个途径:
【Pmem】持久内存介绍及访问模式总结_第8张图片

  • 仍然需要在设备上部署支持持久内存感知的文件系统,然后以内存映射的方式将持久性内存空间导入到用户地址空间,并使用持久性内存编程库(例如英特尔提出的PMDK)对其进行管理。
    该模式下,使用mmap进行内存映射,既能持久存储数据又能用作内存,同时重要的一点是,持久内存可以原生的映射成用户地址空间内存,无需在主存DRAM中缓存文件,这是持久内存感知文件系统的功劳。(正常使用mmap映射外存文件实质上是在主存DRAM中占用了一定的物理地址空间来缓存外存的文件)

内存映射文件mmap机制

传统外存存储及网络设备均由操作系统统一接管,应用程序通过标准化系统调用接口陷入到内核访问硬件设备,操作系统则通过中断机制与外部设备进行交互。

用户空间和内核空间。为了保证内核的安全,现在的操作系统一般都强制用户进程不能直接操作内核(万一一不小心删除了操作系统的内存数据)。具体的实现方式基本都是由操作系统将虚拟地址空间划分为两部分,一部分为内核空间,另一部分为用户空间

以32位linux操作系统为例,寻址空间位2^32=4GB,将最高的1G字节称为内核空间,将较低的3G字节供各个进程使用,称为用户空间。用户空间和内核空间的区别。

所有的系统资源管理都是在内核空间中完成的。比如读写外设磁盘文件,分配回收内存,从网络接口读写数据等等。应用程序是无法直接进行这样的操作的,应用程序只有通过系统调用(诸如read、write等)、软中断、硬中断进入内核态。

mmap这个系统调用,可以将外设的内存映射到用户空间中,使得应用程序可以直接用指针读写映射的内存段,提高了效率。

讲解mmap系统调用比较透彻的几个博客文章:
深入剖析mmap原理 - 从三个关键问题说起
内存映射原理和内核是如何实现的,完全分析mmap原理
以及《深入理解计算机系统》一书中的9.8节
认真分析mmap:是什么 为什么 怎么用
mmap - 用户空间与内核空间
彻底理解mmap()

3. 傲腾持久性内存的命名空间

这部分就是与上面有点模糊的部分,命名空间这个概念是傲腾里自定义的,App Direct模式在四种命名空间中工作,相当于在操作系统中以四种方式工作,简述如下:

  1. fsdax:fsdax 命名空间中的傲腾持内存(FSDAX)是支持挂载有持久内存感知文件系统(也叫直接访问(Direct Access,DAX)功能的文件系统)的块设备。这种文件系统允许通过mmap建立到持久内存介质的直接映射,数据访问路径会绕过内核的page cache。基于文件I/O的应用程序可以通过该命名空间直接与傲腾持久内存进行数据交互。
  2. devdax:devdax命名空间的傲腾持久内存(DEVDAX)是一个支持mmap直接映射的字符设备,用户进程可以像访问DRAM一样直接访问DEVDAX上的数据。但是文件系统不能挂载到DEVDAX上,DEVDAX中的内存地址是通过mmap分配给用户进程的。
  3. sector:sector命名空间可以挂载传统的文件系统,也可以作为小型引导卷使用。
  4. raw:raw命名空间只是一个不支持直接访问的内存盘,这种命名空间不会对傲腾持久内存做任何处理,它不支持扇区数据原子性。由于诸多限制,非特殊情况不建议使用。

参考:张昊. 基于RDMA与持久性内存的用户态文件系统的研究与实现[D].华东师范大学,2022.DOI:10.27149/d.cnki.ghdsu.2022.003963.

四、针对Pmem的一些Benchmark

  1. membench
    • 论文:Evaluating Performance Characteristics of the PMDK Persistent Memory Software Stack
    • 代码链接:https://github.com/nicktehrany/membench
    • 描述:提供了一个baseline,使用匿名mmap映射一段内存空间,测试带宽和读延迟。
  2. STREAM
    • 论文:An Early Evaluation of Intel’s Optane DC Persistent Memory
    • 代码链接:https://www.dropbox.com/sh/nzbmgthxpu5vgml/AAA5ga9KxXLC1QzeqbJ8rzlZa?dl=0
    • 描述:Stream测试是内存测试中业界公认的内存带宽性能测试基准工具。论文中对STREAM进行了修改,得以运行在Pmem上。
  3. pmembench
    • 论文:Building blocks for persistent memory
    • 代码链接:https://github.com/alexandervanrenen/pmembench
    • 描述:首先单独对pmem进行了带宽和延迟的测试,后面对dram和pmem混合使用进行了测试,另外还做了其他大量测试。
  4. PerMA-Bench
    • 论文:PerMA-bench benchmarking persistent memory access
    • 代码链接:https://github.com/hpides/perma-bench
    • 描述:貌似包括numa的测试,较难修改,没有细看
  5. PMIdioBench
    • 论文:Understanding the Idiosyncrasies of Real Persistent Memory
    • 代码链接:https://github.com/padsys/PMIdioBench
    • 描述:这个测试体量有点大,感觉gem5不能完成,并且需要DAX FS和两个numa节点以上
  6. pmem-olap
    • 论文:Maximizing Persistent Memory Bandwidth Utilization for OLAP Workloads
    • 代码链接:https://github.com/hpides/pmem-olap
    • 描述:本文主要针对Pmem在OLAP(在线分析处理)中的作用,主要是将pmem在服务器上使用,体量也很大

你可能感兴趣的:(CXL扩展内存,系统架构,linux)