Red Hat Training

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

第 28 章 持久性内存: NVDIMMs

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

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

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

NVDIMM 交集

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

持久内存访问模式

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

28.1. 使用 ndctl 配置持久内存

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

过程 28.1. 为不支持标签的设备配置 Persistent Memory

  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 会为每个区域创建一个默认命名空间,因为此处的 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. 为支持标签的设备配置 Persistent Memory

  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