Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第 28 章 持久性内存:NVDIMM

持久内存(pmem)也称为存储类内存,是内存和存储的组合。PMEM 将存储的持久性与低访问延迟和动态 RAM (DRAM)的高带宽相结合:
  • 持久内存是字节地址的,因此可以使用 CPU 负载和存储指令访问它。除了访问传统的基于块的存储所需的 read()write() 系统调用外,pmem 还支持直接加载和存储编程模型。
  • 持久内存的性能特征与具有非常低访问延迟的 DRAM 类似,通常以十到百纳秒为单位。
  • 关闭电源(如存储)时会保留持久内存的内容。

对于以下用例,使用持久性内存很有用:

快速启动:数据集已在内存中。
快速开始也被称为 温缓存 效果。文件服务器启动后,内存中没有文件内容。当客户端连接和读取和写入数据时,这些数据会缓存在页面缓存中。最后,缓存包括大多数热数据。重启后,系统必须再次启动该进程。
如果应用设计正确,持久内存允许应用在重启后保留热缓存。在本实例中,不会涉及页面缓存:应用程序会直接在持久内存中缓存数据。
快速写缓存
在数据位于持久介质前,文件服务器通常不会确认客户端的写入请求。将持久内存用作快速写入缓存可让文件服务器快速确认写入请求,因为 pmem 的低延迟。

NVDIMMs Interleaving

非易失性双内存模块(NVDIMM)可以按照与常规 DRAM 相同的方式分组为交集。interleave 集与跨多个 DIMM 的 RAID 0 (条带)类似。
以下是 NVDIMMS 交集的优点:
  • 与 DRAM 一样,NVDIMM 会在配置为 interleave 集时从性能提高。
  • 它可用于将多个较小的 NVDIMM 组合为一个较大的逻辑设备。
使用系统 BIOS 或 UEFI 固件配置 interleave 集。
在 Linux 中,每个交集都会创建一个区域设备。
以下是区域设备和标签之间的关系:
  • 如果您的 NVDIMM 支持标签,则区域设备可以进一步划分为命名空间。
  • 如果您的 NVDIMM 不支持标签,则区域设备只能包含一个命名空间。在这种情况下,内核会创建一个覆盖整个区域的默认命名空间。

持久性内存访问模式

您可以使用 扇区fsdaxdevdax (设备直接访问)或 raw 模式中的持久性内存设备:
扇区模式
它将存储显示为一个快速块设备。使用扇区模式对于尚未修改以使用持久内存的传统应用程序或利用完整 I/O 堆栈的应用程序(包括设备映射器)非常有用。
fsdax 模式
它允许持久内存设备支持直接访问编程,如存储网络行业关联( SNIA)非易失性内存(NVM)编程模型规格 中所述。在这个模式中,I/O 会绕过内核的存储堆栈,因此无法使用很多设备映射器驱动程序。
devdax 模式
devdax (device DAX)模式通过使用 DAX 字符设备节点提供对持久内存的原始访问。可以使用 CPU 缓存清除和隔离指令,使 devdax 设备中的数据可用。某些数据库和虚拟机虚拟机监控程序可能会受益于 devdax 模式。无法在 devdax 实例上创建文件系统。
原始模式
原始模式命名空间有几个限制,不应使用。

28.1. 使用 ndctl 配置持久内存

使用 ndctl 工具配置持久内存设备。要安装 ndctl 工具,请使用以下命令:
# yum install ndctl

过程 28.1. 为不支持标签的设备配置持久性内存

  1. 列出系统上可用的 pmem 区域。在以下示例中,命令列出了不支持标签的 NVDIMM-N 设备:
    # ndctl list --regions
    [
      {
        "dev":"region1",
        "size":34359738368,
        "available_size":0,
        "type":"pmem"
      },
      {
        "dev":"region0",
        "size":34359738368,
        "available_size":0,
        "type":"pmem"
      }
    ]
    
    Red Hat Enterprise Linux 为每个区域创建一个 default 命名空间,因为这里的 NVDIMM-N 设备不支持标签。因此,可用大小为 0 字节。
  2. 列出系统中所有不活跃的命名空间:
    # ndctl list --namespaces --idle
    [
      {
        "dev":"namespace1.0",
        "mode":"raw",
        "size":34359738368,
        "state":"disabled",
        "numa_node":1
      },
      {
        "dev":"namespace0.0",
        "mode":"raw",
        "size":34359738368,
        "state":"disabled",
        "numa_node":0
      }
    ]
    
  3. 重新配置不活跃的命名空间,以使用此空间。例如,要将 namespace0.0 用于支持 DAX 的文件系统,请使用以下命令:
    # ndctl create-namespace --force --reconfig=namespace0.0 --mode=fsdax --map=mem 
    {
      "dev":"namespace0.0",
      "mode":"fsdax",
      "size":"32.00 GiB (34.36 GB)",
      "uuid":"ab91cc8f-4c3e-482e-a86f-78d177ac655d",
      "blockdev":"pmem0",
      "numa_node":0
    }
    

过程 28.2. 为支持标签的设备配置持久性内存

  1. 列出系统上可用的 pmem 区域。在以下示例中,命令列出了支持标签的 NVDIMM-N 设备:
    # ndctl list --regions
    [
      {
        "dev":"region5",
        "size":270582939648,
        "available_size":270582939648,
        "type":"pmem",
        "iset_id":-7337419320239190016
      },
      {
        "dev":"region4",
        "size":270582939648,
        "available_size":270582939648,
        "type":"pmem",
        "iset_id":-137289417188962304
      }
    ]
    
  2. 如果 NVDIMM 设备支持标签,则不会创建默认命名空间,您可以在不使用 --force--reconfigure 标志的情况下从区域分配一个或多个命名空间:
    # ndctl create-namespace --region=region4 --mode=fsdax --map=dev --size=36G
    {
      "dev":"namespace4.0",
      "mode":"fsdax",
      "size":"35.44 GiB (38.05 GB)",
      "uuid":"9c5330b5-dc90-4f7a-bccd-5b558fa881fe",
      "blockdev":"pmem4",
      "numa_node":0
    }
    
    现在,您可以从同一区域创建另一个命名空间:
    # ndctl create-namespace --region=region4 --mode=fsdax --map=dev --size=36G
    {
      "dev":"namespace4.1",
      "mode":"fsdax",
      "size":"35.44 GiB (38.05 GB)",
      "uuid":"91868e21-830c-4b8f-a472-353bf482a26d",
      "blockdev":"pmem4.1",
      "numa_node":0
    }
    
    您还可以使用以下命令从同一区域创建不同类型的命名空间:
    # ndctl create-namespace --region=region4 --mode=devdax --align=2M --size=36G
    {
      "dev":"namespace4.2",
      "mode":"devdax",
      "size":"35.44 GiB (38.05 GB)",
      "uuid":"a188c847-4153-4477-81bb-7143e32ffc5c",
      "daxregion":
      {
        "id":4,
        "size":"35.44 GiB (38.05 GB)",
        "align":2097152,
        "devices":[
          {
            "chardev":"dax4.2",
            "size":"35.44 GiB (38.05 GB)"
          }]
      },
        "numa_node":0
    }
    
有关 ndctl 工具的更多信息,请参阅 man ndctl