Red Hat Training

A Red Hat training course is available for RHEL 8

7.8. 在 NVDIMM 上创建文件系统 DAX 命名空间

在文件系统 DAX 模式下配置附加到系统的 NVDIMM 设备,以支持具有直接访问功能的文件系统。

考虑以下选项:

  • 将现有命名空间重新配置为文件系统 DAX 模式。
  • 如果有可用空间,创建新文件系统 DAX 命名空间。
重要

文件系统 DAX 技术仅作为技术预览提供,不受红帽支持。

7.8.1. 文件系统直接访问模式中的 NVDIMM

当在文件系统直接访问(文件系统 DAX、fsdax)模式下配置 NVDIMM 设备时,您可以在上面创建一个文件系统。对此文件系统上的文件执行 mmap() 操作的任何应用程序都可以直接访问其存储。这启用了 NVDIMM 的直接访问编程模型。

以下新的 -o dax 选项现在可用,如果需要,可以通过文件属性控制直接访问行为:

-o dax=inode

当您不要在挂载文件系统时指定任何 dax 选项时,这个选项是默认选项。使用这个选项,您可以在文件上设置属性标志,以控制是否激活 dax 模式。如果需要,您可以在单个文件中设置此标志。

您还可以在一个目录上设置此标志,并且该目录中的任何文件将使用相同的标志创建。您可以使用 xfs_io -c 'chattr +x' directory-name 命令设置此属性标志。

-o dax=never
使用此选项时,即使 dax 标记被设置为 inode 模式,也不会启用 dax 模式。这意味着,per-inode dax 属性标志会被忽略,使用这个标志设置的文件永远不会启用直接访问。
-o dax=always

这个选项等同于旧的 -o dax 行为。使用这个选项,您可以激活文件系统中任何文件的直接访问模式,而不考虑 dax 属性标志。

警告

在以后的发行版本中,-o dax 可能不被支持,如果需要,您可以使用 -o dax=always。在这个模式中,每个文件都可能处于直接访问模式。

按页元数据分配

这个模式需要在系统 DRAM 或 NVDIMM 设备本身中分配每个页面元数据。每个 4 KiB 页的这个数据结构的开销是 64 字节:

  • 在小设备中,开销非常小,足以满足 DRAM 的要求。例如,16-GiB 命名空间只需要 256 MiB 用于页面结构。因为 NVDIMM 设备通常比较小且昂贵,所以最好将页面跟踪数据结构保存在 DRAM 中。
  • 在大小为 TB级或更大的 NVDIMM 设备中,存储页面跟踪数据结构所需的内存量可能会超过系统中的 DRAM 数量。一个 TiB 的 NVDIMM 需要 16 GiB 用于页面结构。因此,在这种情况下首选将数据结构存储在 NVDIMM 本身中。

    您可以在配置命名空间时使用 --map 选项配置每个页面元数据存储的位置:

  • 要在系统 RAM 中分配,请使用 --map=mem
  • 要在 NVDIMM 上分配,请使用 --map=dev

7.8.2. 将现有的 NVDIMM 命名空间重新配置为文件系统 DAX 模式

您可以将现有的非易失性双内存模块 (NVDIMM) 命名空间重新配置为文件系统 DAX 模式。

警告

重新配置命名空间会删除之前在命名空间中存储的数据。

先决条件

  • 已安装 ndctl 工具。如需更多信息,请参阅安装 ndctl

流程

  1. 列出系统中的所有命名空间:

    # ndctl list --namespaces --idle
    [
      {
        "dev":"namespace1.0",
        "mode":"raw",
        "size":34359738368,
        "uuid":"ac951312-b312-4e76-9f15-6e00c8f2e6f4"
        "state":"disabled",
        "numa_node":1
      },
      {
        "dev":"namespace0.0",
        "mode":"raw",
        "size":38615912448,
        "uuid":"ff5a0a16-3495-4ce8-b86b-f0e3bd9d1817",
        "state":"disabled",
        "numa_node":0
      }
    ]
  2. 重新配置任何命名空间:

    # ndctl create-namespace --force --mode=fsdax --reconfig=namespace-ID

    例 7.5. 将命名空间配置为文件系统 DAX

    要将 namespace0.0 用于支持 DAX 的文件系统,请使用以下命令:

    # ndctl create-namespace --force --mode=fsdax --reconfig=namespace0.0
    {
      "dev":"namespace0.0",
      "mode":"fsdax",
      "map":"dev",
      "size":"11.81 GiB (12.68 GB)",
      "uuid":"f8153ee3-c52d-4c6e-bc1d-197f5be38483",
      "sector_size":512,
      "align":2097152,
      "blockdev":"pmem0"
    }

    命名空间现在位于 /dev/pmem0 路径中。

验证

  • 验证系统中的现有命名空间是否已重新配置:

    # ndctl list --namespace namespace0.0
    [
      {
        "dev":"namespace0.0",
        "mode":"fsdax",
        "map":"dev",
        "size":12681478144,
        "uuid":"f8153ee3-c52d-4c6e-bc1d-197f5be38483",
        "sector_size":512,
        "align":2097152,
        "blockdev":"pmem0"
      }
    ]

其他资源

  • ndctl-create-namespace (1) 手册页

7.8.3. 在文件系统 DAX 模式下创建新 NVDIMM 命名空间

如果区域中有可用空间,您可以在非线性内存模块 (NVDIMM) 设备上创建一个新文件系统 DAX 命名空间。

先决条件

  • 已安装 ndctl 工具。如需更多信息,请参阅安装 ndctl
  • NVDIMM 设备支持标签在区域中创建多个命名空间。您可以使用以下命令检查它:

    # ndctl read-labels nmem0 >/dev/null
    read 1 nmem

    这表示它读取一个 NVDIMM 设备的标签。如果值为 0,这表示您的设备不支持标签。

流程

  1. 列出系统上有可用空间的 pmem 区域。在以下示例中,在 region1region0 区域中有空间:

    # ndctl list --regions
    [
      {
        "dev":"region1",
        "size":2156073582592,
        "align":16777216,
        "available_size":2117418876928,
        "max_available_extent":2117418876928,
        "type":"pmem",
        "iset_id":-9102197055295954944,
        "badblock_count":1,
        "persistence_domain":"memory_controller"
      },
      {
        "dev":"region0",
        "size":2156073582592,
        "align":16777216,
        "available_size":2143188680704,
        "max_available_extent":2143188680704,
        "type":"pmem",
        "iset_id":736272362787276936,
        "badblock_count":3,
        "persistence_domain":"memory_controller"
      }
    ]
  2. 在任何可用区域上分配一个或多个命名空间:

    # ndctl create-namespace --mode=fsdax --region=regionN --size=namespace-size

    例 7.6. 在区域上创建命名空间

    以下命令在 region0 上创建 36-GiB 文件系统 DAX 命名空间:

    # ndctl create-namespace --mode=fsdax --region=region0 --size=36G
    {
      "dev":"namespace0.3",
      "mode":"fsdax",
      "map":"dev",
      "size":"35.44 GiB (38.05 GB)",
      "uuid":"99e77865-42eb-4b82-9db6-c6bc9b3959c2",
      "sector_size":512,
      "align":2097152,
      "blockdev":"pmem0.3"
    }

    命名空间现在作为 /dev/pmem0.3 提供。

验证

  • 验证新命名空间是否在扇区模式中创建:

    # ndctl list -RN -n namespace0.3
    {
      "regions":[
        {
          "dev":"region0",
          "size":2156073582592,
          "align":16777216,
          "available_size":2027224563712,
          "max_available_extent":2027224563712,
          "type":"pmem",
          "iset_id":736272362787276936,
          "badblock_count":3,
          "persistence_domain":"memory_controller",
          "namespaces":[
            {
              "dev":"namespace0.3",
              "mode":"fsdax",
              "map":"dev",
              "size":38048628736,
              "uuid":"99e77865-42eb-4b82-9db6-c6bc9b3959c2",
              "sector_size":512,
              "align":2097152,
              "blockdev":"pmem0.3"
            }
          ]
        }
      ]
    }

其他资源

  • ndctl-create-namespace (1) 手册页

7.8.4. 在文件系统 DAX 设备中创建文件系统

您可以在文件系统 DAX 设备中创建文件系统并挂载文件系统。创建文件系统后,应用程序可以使用持久内存并在 mount-point 目录中创建文件,打开文件,并使用 mmap 操作来映射文件以进行直接访问。

在 Red Hat Enterprise Linux 8 中,作为技术预览可在 NVDIMM 上创建 XFS 和 ext4 文件系统。

流程

  1. 可选:在文件系统 DAX 设备中创建一个分区。如需更多信息,请参阅使用 parted 创建分区

    注意

    当在 fsdax 设备中创建分区时,分区必须在页边界上保持一致。在 Intel 64 和 AMD64 构架中,启动和结束分区至少需要 4 KiB 校对。2 MiB 是首选的校对。

    默认情况下,parted 工具在 1 MiB 边界上对齐分区。对于第一个分区,指定 2 MiB 作为分区的起点。如果分区的大小是 2 MiB 的倍数,则所有其他分区也都一致。

  2. 在分区或者 NVDIMM 设备中创建 XFS 或者 ext4 文件系统:

    # mkfs.xfs  -d su=2m,sw=1 fsdax-partition-or-device
    注意

    现在,支持 dax 的文件和 reflinked 文件现在可以在文件系统中共存。但是,对于单个文件,dax 和 reflink 是互斥的。

    对于 XFS,禁用共享的 copy-on-write 数据扩展,因为它们与 dax 挂载选项不兼容。另外,为了增加大型页面映射的可能性,请设置条带单元和条带宽度。

  3. 挂载文件系统:

    # mount f_sdax-partition-or-device mount-point_

    不需要使用 dax 选项挂载文件系统来启用直接访问模式。当您在挂载时没有指定 dax 选项时,文件系统处于 dax=inode 模式。在激活直接访问模式前,在文件上设置 dax 选项。

其他资源