SplitFS

Design of SplitFS

Ext4-DAX的索引路

SplitFS 将文件系统在逻辑上拆分为用户空间部分(U-Split)和内核空间部分(K-Split),其中 K-Split 使用 ext4-DAX。通过 U-Split 将一个文件拆分为多个 2MB 区域,其中每个区域映射到一个 ext4-DAX 文件。 USplit 和 K-Split 都参与索引:U-Split 将一个逻辑文件偏移映射到对应的 ext4-DAX 文件,K-Split 中的 ext4-DAX 进一步搜索其extent index 以获取实际物理地址。

SplitFS还提出了一种名为relink的新操作,以提高文件扩展的性能,并在没有双重写入数据的情况下在文件写入时提供崩溃一致性。在其同步模式下,文件增加首先添加到一个暂存文件,然后在调用fsync()或暂存文件达到其大小限制时重新链接到目标文件;文件覆盖已应用。在严格模式下,每个文件写入,无论是覆盖还是附加数据,都会应用于暂存文件,并在每次写入结束时重新链接。因此,SplitFS 的索引时间包括内核和用户组件中的重新链接、mmap 和索引。

PMDK从pmemobj到物理地址的映射流程

三重映射

  • 从pmemobj的ID到虚拟地址的映射
  • 从虚拟地址到文件内偏移的映射
  • 从文件到物理地址的映射

pmemobj到虚拟地址的映射

  • 查看pmemobj的创建函数 pmemobj_createW(src\libpmemobj\obj.c)

    1. pmemobj_createW —> pmemobj_createU(src\libpmemobj\obj.c)

    2. pmemobj_createU —> util_pool_create(src\common\set.c)

    3. util_pool_create —> util_pool_create_uuids(src\common\set.c)

    4. util_pool_create_uuids —> util_poolset_create_set(src\common\set.c)

    5. util_poolset_create_set —> util_poolset_single(src\common\set.c)

    6. 设置DAX模式就主要到util_poolset_single进行处理

      ​ 其中rep->part[0].fd成员使用 util_poolset_file填充

      rep->part[0].alignment使用device_dax_alignment填充

  • 查看pmemobj_open函数(src\libpmemobj\obj.c)