21.8. 在 NVDIMM 上创建文件系统 DAX 命名空间
在文件系统 DAX 模式下配置附加到您系统的 NVDIMM 设备,以支持具有直接访问功能的文件系统。
考虑以下选项:
- 将现有命名空间重新配置为文件系统 DAX 模式。
- 如果有可用空间,请创建新文件系统 DAX 命名空间。
文件系统 DAX 技术仅作为技术预览提供,不受红帽支持。
21.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
。
21.8.2. 将现有的 NVDIMM 命名空间重新配置为文件系统 DAX 模式
您可以将现有的非易失性双内存模块 (NVDIMM) 命名空间重新配置为文件系统 DAX 模式。
重新配置命名空间会删除之前在命名空间中存储的数据。
先决条件
-
已安装
ndctl
工具。如需更多信息,请参阅安装 ndctl。
流程
列出系统中的所有命名空间:
# 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 } ]
重新配置任何命名空间:
# ndctl create-namespace --force --mode=fsdax --reconfig=namespace-ID
例 21.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)
手册页
21.8.3. 在文件系统 DAX 模式下创建新 NVDIMM 命名空间
如果区域中有可用空间,您可以在非线性内存模块 (NVDIMM) 设备上创建一个新文件系统 DAX 命名空间。
先决条件
-
已安装
ndctl
工具。如需更多信息,请参阅安装 ndctl。 NVDIMM 设备支持标签在区域中创建多个命名空间。您可以使用以下命令检查它:
# ndctl read-labels nmem0 >/dev/null read 1 nmem
这表示它读取一个 NVDIMM 设备的标签。如果值为
0
,这表示您的设备不支持标签。
流程
列出系统上有可用空间的
pmem
区域。在以下示例中,在 region1 和 region0 区域中有空间:# 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" } ]
在任何可用区域上分配一个或多个命名空间:
# ndctl create-namespace --mode=fsdax --region=regionN --size=namespace-size
例 21.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)
手册页
21.8.4. 在文件系统 DAX 设备中创建文件系统
您可以在文件系统 DAX 设备中创建文件系统并挂载文件系统。创建文件系统后,应用程序可以使用持久内存并在 mount-point 目录中创建文件,打开文件,并使用 mmap
操作来映射文件以进行直接访问。
在 Red Hat Enterprise Linux 9 中,作为技术预览可在 NVDIMM 上创建 XFS 和 ext4 文件系统。
流程
可选:在文件系统 DAX 设备中创建一个分区。如需更多信息,请参阅使用 parted 创建分区。
注意当在
fsdax
设备中创建分区时,分区必须在页边界上保持一致。在 Intel 64 和 AMD64 构架中,启动和结束分区至少需要 4 KiB 校对。2 MiB 是首选的校对。默认情况下,
parted
工具在 1 MiB 边界上对齐分区。对于第一个分区,指定 2 MiB 作为分区的起点。如果分区的大小是 2 MiB 的倍数,则所有其他分区也都一致。在分区或者 NVDIMM 设备中创建 XFS 或者 ext4 文件系统:
# mkfs.xfs -d su=2m,sw=1 fsdax-partition-or-device
注意现在,支持 dax 的文件和 reflinked 文件现在可以在文件系统中共存。但是,对于单个文件,dax 和 reflink 是互斥的。
对于 XFS,禁用共享的 copy-on-write 数据扩展,因为它们与 dax 挂载选项不兼容。另外,为了增加大型页面映射的可能性,请设置条带单元和条带宽度。
挂载文件系统:
# mount f_sdax-partition-or-device mount-point_
不需要使用 dax 选项挂载文件系统来启用直接访问模式。当您在挂载时没有指定 dax 选项时,文件系统处于
dax=inode
模式。在激活直接访问模式前,在文件上设置 dax 选项。
其他资源
-
您系统上的
mkfs.xfs (8)
手册页 - 文件系统直接访问模式中的 NVDIMM