64、ADAM:自适应目录加速机制的创新与实践

ADAM:自适应目录加速机制的创新与实践

1. 背景与动机

1.1 非易失性内存(NVM)特点

非易失性内存(NVM)与传统内存技术相比,具有独特的特性。以下是不同内存技术的特性对比表格:
| 类别 | 读取延迟 | 写入延迟 | 写入耐久性 | 字节可寻址 |
| ---- | ---- | ---- | ---- | ---- |
| DRAM | 60 ns | 60 ns | 10¹⁶ | 是 |
| PCM | 50 - 70 ns | 150 - 1000 ns | 10⁹ | 是 |
| ReRAM | 25 ns | 500 ns | 10¹² | 是 |
| NAND Flash | 35 µs | 350 µs | 10⁵ | 否 |

从表格中可以看出,NVM的读取延迟略短于DRAM,但写入延迟明显长于DRAM。而且,NVM的写入耐久性有限,不过它具有字节可寻址的优势,并且像DRAM一样具有较高的随机访问性能,优于传统闪存。在混合DRAM/NVMM架构中,NVM的长写入延迟是其缺点,而字节可寻址性是其优点。因此,设计适合NVM字节可寻址性并减少写入次数的目录机制,以加速目录访问是很有必要的。

1.2 高目录访问开销问题

当前基于NVM的文件系统的目录机制存在一些问题,这些问题严重影响了文件系统的性能:
- 传统设计不适合NVM :当前基于NVM的文件系统主要遵循传统目录设计,这种设计适用于块可寻址的磁盘,而不适用于字节可寻址的NVM。虽然NVM解决了全名称目录命名空间的写入放大问题,但在重命名全路径名时,写入开销仍然很大,从而减慢了目录操作。
- 目录名不唯一且耦合性强 :在当前的多级目录命名空间中,目录名不是唯一的,不能作为独立的索引。因此,目录元数据和索引节点紧密耦合,这增加了保持索引节点和目录元数据一致性的写入开销。
- 目录状态未充分利用 :目录的状态(如读写频率和目录大小)在系统运行期间会不断变化,对系统性能产生不同的影响,但当前文件系统并未充分利用这些状态。

为了解决这些问题,需要设计一种NVM友好的目录机制,以加速目录访问。新的目录设计需要削弱目录和索引节点之间的耦合,减少一致性保证的写入开销,同时降低目录和文件的访问延迟。此外,利用不同的目录状态并设计自适应机制,使系统在运行时保持最佳性能是有益的。

2. ADAM设计

2.1 ADAM布局

ADAM布局包含四个部分:AFDN区域、多级哈希表、区域管理表(AMT)和DRAM缓存树,如下图所示:

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px

    A(AFDN区域):::process --> B(多级哈希表):::process
    A --> C(AMT区域):::process
    A --> D(DRAM缓存树):::process
  • AFDN区域 :ADAM在一个2MB的块数组中初始化每个AFDN区域。每个目录和文件条目最初在128字节边界上对齐。ADAM以循环方式将新的目录/文件条目分配到AFDN区域,使目录/文件均匀分布在各个AFDN区域中。每个AFDN区域有一个具有完整路径名的根目录和大量子目录,子目录存储相对于根目录名的自适应路径名。因此,AFDN通过使用这种唯一的路径名来解耦目录元数据和索引节点。此外,重命名AFDN区域的根目录不会对子目录产生写入开销。每个AFDN区域都有一个区域ID,它是根名称的哈希值。AFDN区域包含两部分:目录/文件条目和状态映射。
  • 状态映射 :状态映射是一个两位位图,其中每个槽标记AFDN区域中条目的状态。状态映射位于AFDN区域的头部。状态映射中的2位槽可以表示四种不同的状态:
    • 00:表示AFDN区域中的无效条目
    • 01:表示有效文件或冷目录
    • 10:表示温目录
    • 11:表示热目录

热标签代表更高的访问开销。当选择热目录作为根目录时,ADAM可以获得最佳性能,以减少重命名开销和读取延迟。
- 多级哈希表 :为每个AFDN区域构建多级哈希表,以支持快速的目录/文件定位。哈希条目包含自适应路径名的哈希值和AFDN条目的位置作为哈希对。为了减少哈希表的大小,每个哈希条目包含一个有效位,这样可以重用无效的哈希条目来存储新的文件和目录。
- 区域管理表(AMT) :AMT记录AFDN区域和相应哈希表的地址,它被分配并初始化为一个4KB的块。AMT有两部分:位图和54字节的槽。位图管理槽的分配和释放,每个槽被缓存在DRAM中,以减少索引延迟。
- DRAM缓存树 :ADAM在DRAM中保留两种基数树:AMT基数树和状态基数树。状态基数树用于计算目录状态,它记录每个访问目录的读取频率、写入频率和目录大小。AMT基数树的叶子存储与NVM AMT槽相同的信息。AMT基数树是混合索引的重要组成部分。

2.2 混合索引

混合索引包含三个部分:AFDN哈希表、AMT和DRAM基数树。多级哈希表提供了一个很好的哈希冲突解决方案,同时提供快速访问。使用基数树是因为Linux内核中有成熟、经过充分测试和广泛使用的实现。通过DRAM基数树搜索,可以轻松快速地找到正确的AFDN区域和相应的哈希表。根据前面的内存特性表格,DRAM具有最快的访问速度,适合存储最频繁访问的索引结构。AMT具有高频率访问和较小的DRAM空间需求。

应用程序可以通过以下步骤使用混合索引快速定位目录和文件:
1. 使用路径名计算AFDN区域ID。
2. 在AMT基数树中搜索正确的叶子节点。
3. 找到AFDN区域和相应哈希表的地址。
4. 通过哈希键值对定位目录。

2.3 目录状态

为了对不同的目录进行分类,考虑了读取频率、写入频率和大小这三个重要状态。目录的状态在不同的应用程序中会发生变化,并被分为5组:{小尺寸、大尺寸、频繁读取、很少读取、频繁写入、很少写入}。写入开销主要由目录重命名和创建引起。定义了3个标签来对不同的目录进行分类:{热、温、冷}。不同的标签代表不同的访问开销,热目录带来的访问开销最大。以下是目录状态和状态映射标签的映射表格:
| 状态 | 标签 | 位值 | 大小 | 写入 | 读取 |
| ---- | ---- | ---- | ---- | ---- | ---- |
| 小且频繁读写 | 温 | 10 | 小 | 频繁 | 频繁 |
| 很少读写且频繁读取 | 冷 | 01 | 任何 | 很少 | 频繁 |
| 大且频繁读写 | 热 | 11 | 大 | 频繁 | 频繁 |
| 很少读写且很少读取 | 温 | 10 | 任何 | 很少 | 很少 |
| 无效 | 无效 | 00 | 无效 | 无效 | 无效 |

2.3.1 三个重要状态的意义
  • 读取频率 :选择一个大且频繁读取的目录作为新AFDN区域的根目录,可以大大减少对这个新根目录及其子目录的访问延迟。根目录或根目录的子目录只需要一次计算就能找到目标文件所属的AFDN区域,而其他目录则需要更多的递归计算。最坏情况下的计算次数与传统多级目录命名空间中的递归扫描次数相同。
  • 写入频率 :由于写入开销对NVM性能影响最大,因此在计算目录标签时,将写入频率作为主要因素。
  • 大小 :较大的目录更有可能产生大量的写入开销,因此大小也是一个重要因素。
2.3.2 状态计算方法
  • 读取频率计算 :ADAM首先统计每个访问目录的访问次数,并将值记录在DRAM状态树中。然后计算AFDN区域的平均读取时间。如果目录访问时间超过平均值,则标记为频繁读取;如果小于平均值,则标记为很少读取。
  • 写入频率计算 :由于重命名带来的写入开销最大,因此一旦目录被重命名,ADAM就将其标记为频繁写入。在运行期间从未被重命名的目录被标记为很少写入。
  • 大小计算 :ADAM引入了最大大小(Size Max)和最小大小(Size Min)来确定目录的大小状态。每个不是其AFDN区域根目录的目录的大小最多为Size Max,每个区域的大小至少为Size Min。在实现中,Size Max = Size Min = 512 KB。当目录大小大于Size Max时,将其标记为大;当小于Size Min时,将其标记为小。

根据上述计算规则和映射关系,每5秒更新一次存储在NVM状态映射中的值,然后再执行演化策略。

2.4 演化策略

为了适应系统运行期间不断变化的状态,定义了AFDN区域之间的三种演化方式:分裂、合并和继承,如下图所示:

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px

    A(分裂):::process --> B(创建新AFDN区域并选择根目录):::process
    C(合并):::process --> D(将小且少访问的AFDN区域合并回父区域):::process
    E(继承):::process --> F(强子目录替换父根目录):::process
  • 分裂 :当系统定期检查状态映射中的标签并发现一个带来大访问开销的热目录时,执行分裂操作。分裂是创建新AFDN区域并选择相应根目录的方式。分裂时,ADAM将所有子文件和子目录复制到新分配的AFDN区域,然后更改它们的自适应名称,而根目录仍留在原始AFDN区域。
  • 合并 :当一个旧的AFDN区域很小且很少被访问时,会发生合并操作。这种AFDN区域浪费了近2MB的块数组,因为无效条目占据了大部分空间,其余的子目录和子文件很少被访问或重命名。一旦找到满足条件的根目录,就将目录和文件合并回其父AFDN区域,然后释放该区域以使其可重用。
  • 继承 :继承定义了一种AFDN演化方式,即一个强大的子目录替换其父根目录。强大的子目录是指具有大尺寸且对AFDN区域的大部分访问有贡献的目录。继承操作的步骤如下:
    1. 检测到AFDN /R/A/B中的强子目录/C,并满足继承条件。
    2. 将/C及其兄弟目录/文件合并回父AFDN区域/R,并设置它们的新自适应路径名。
    3. 将旧根目录/A/B的类型更改为普通目录,并将/A/B/C设置为新的根目录。
    4. 将AFDN区域的完整路径名从/R/A/B更改为/R/A/B/C。
    5. 重置AFDN /R和AFDN /R/A/B/C的状态映射。

演化策略使系统能够适应不同的状态,并在运行时保持最佳和稳定的性能。在实现中,ADAM每5秒在后台检查所有访问的AFDN区域的状态映射,然后在执行演化策略之前更新相应的状态映射。虽然演化策略在复制分裂目录条目时会带来小的空间开销,但与分裂发生时文件和目录的总大小相比,牺牲小的空间开销来加速目录访问并保持系统稳定是合理的。

3. ADAM实现

为了验证ADAM机制的有效性,将其实现在NOVA这一先进的基于日志结构的NVM文件系统上。当然,ADAM也可以应用于其他基于NVM的文件系统,如PMFS或HMVFS,以加速目录访问并减少写入开销。

3.1 优化索引

在混合DRAM/NVMM文件系统中,由于DRAM和NVM具有不同的特性,因此索引需要充分利用更快的DRAM和更大的NVM的优势。NOVA将所有目录和文件都缓存在DRAM中,这占用了过多的DRAM空间,没有很好地平衡两者的使用。

受HiKV的启发,实现了一种优化的混合目录索引,具体做法是:
- 在NVM中使用大型哈希表。
- 在DRAM中使用频繁访问的基数树,并且只缓存AFDN区域的索引,以此节省DRAM空间开销。

此外,与NOVA中用于目录日志条目的线性链表相比,哈希表可以大大加速目录和文件的名称搜索。

3.2 高效日志记录

NOVA在保持DRAM基数树和NVM结构之间的一致性时会产生较大的开销,因为它将所有目录和文件都复制到DRAM中。这种一致性开销包括检查大型基数树和记录日志。

而ADAM通过以下方式减少了写日志的规模:
- 首先将数据写入一个固定大小的日志缓冲区,该缓冲区的大小与状态映射相同,然后原子性地更新NVM状态映射的2位槽。
- 利用mfence和clflush指令来强制写入顺序,这些指令在基于NVM的存储系统中被广泛使用,以确保一致性。

通过这些措施,ADAM与NOVA相比,大大降低了一致性开销。

3.3 轻量级更新

传统的多级目录命名空间中,目录和索引节点紧密耦合,这使得遵循这种传统机制的文件系统在频繁的目录/索引节点日志记录和更新时会带来很大的写入开销。

ADAM采用自适应路径名,使得目录能够独立地被查找和更新,避免了因索引节点更新而导致的冗余更新。因此,ADAM大大减少了更新频率,最小化了目录更新开销。

4. 评估

4.1 实验设置

为了评估ADAM的性能,将带有ADAM的NOVA与PMFS、原始NOVA和EXT4 - DAX进行了对比实验。实验在一台配备64个英特尔至强2 GHz处理器和128G DRAM的商用服务器上进行,运行Linux 4.3.0内核,对于PMFS则将内核更改为3.11.0。

对于EXT4 - DAX,使用从DRAM中划分出来的64 GB的虚拟磁盘来模拟NVM。对于PMFS和NOVA,使用grub选项memmap预留64 GB的内存。用户进程和缓冲区缓存使用剩余的空闲DRAM空间。

由于NVM与DRAM相比,读取性能相似,但写入性能明显较慢,因此引入了额外的NVM写入延迟来模拟NVM较长的写入延迟,写入延迟设定为500ns,这是不同NVM写入延迟的平均值。

使用的微基准测试及其特性如下表所示:
| 名称 | 工作负载 |
| ---- | ---- |
| filetest | (i) 创建10⁴个文件 (ii) 删除10⁴个文件 |
| dirtest | (i) 创建10⁴个目录 (ii) 删除10⁴个目录 |

4.2 写入性能改进

使用上述两个单线程微基准测试来评估带有ADAM的NOVA(ADAM - NOVA)的写入性能。这两个微基准测试对写入敏感,因为目录和文件的创建和删除操作都涉及较大的写入开销。所有结果均取五次运行的平均值。

实验结果如下:
| 操作 | 对比指标 | ADAM - NOVA相对NOVA的提升 |
| ---- | ---- | ---- |
| 创建文件 | 吞吐量 | 增加8.6% |
| 创建文件 | 延迟 | 减少7.7% |
| 创建目录 | 吞吐量 | 增加24% |
| 创建目录 | 延迟 | 减少19% |
| 删除文件 | 吞吐量 | 增加76% |
| 删除文件 | 延迟 | 减少43% |
| 删除目录 | 吞吐量 | 增加37% |
| 删除目录 | 延迟 | 减少29% |

从这些结果可以看出,在创建、创建目录、删除文件和删除目录等操作中,ADAM - NOVA始终表现出最佳性能。

综上所述,ADAM通过独特的设计和实现策略,有效地解决了基于NVM的文件系统中存在的高目录访问开销问题,显著提升了文件系统的性能,特别是在写入性能方面。其自适应的机制和优化的索引、日志记录与更新方式,使得系统能够更好地适应不同的工作负载和目录状态变化,为基于NVM的文件系统的发展提供了一种有效的解决方案。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值