BetrFS: A Compleat File System for Commodity SSDs——论文阅读

EuroSys 2022 Paper 分布式元数据论文汇总

问题

在不同的工作负载下,没有单一的Linux文件系统在普通SSD上始终表现良好。我们将一个完备的文件系统定义为在各种微基准测试和应用程序中,没有一个工作负载的性能低于最佳文件系统性能的30%,并且大多数工作负载实现至少85%的最佳文件系统性能。在普通SSD上没有一个文件系统是完备的。

现有文件系统局限性

BetrFS的问题

  • 顺序写入和过多的文件数据拷贝:数据写入时总是在每个级别上存储,在Bε树中,数据被刷新到内存中树的每一级时,也被复制到一个新的页面中,当数据写入ext4时,它会被再次复制。类似的复制发生在读取路径上。

  • 小写和双重日志。例如重命名操作会产生sync(),导致对ext4的小写。在BetrFS和ext4上都需要记录日志,导致2倍的开销。

  • 顺序读取和预读。发现VFS级别预读不太适合BetrFS的较低级别,即从ext4中读取大的Bε树节点,因为启发式算法只在KB的阶上操作,而Bε树的叶节点是4MB。理想情况下,在处理当前4MB时,应该预取整个下一个叶和任何其他祖先节点,应用消息,并具体化下一个叶子的视图。

  • 文件创建和存在性检查。创建文件时需要先检查文件是否存在,有大量创建小文件的操作时,会产生大量单个消息,破坏了BetrFS的批处理思想。

  • 递归删除和范围消息。范围删除在HDD上足够快,但在SSD上执行递归目录删除时会成为瓶颈。

  • 小写入和缓冲区大小调整。将BetrFS从HDD移动到SSD时,内存管理是一个关键的瓶颈,因为在管理内存中的Bε树消息时,很难预测缓冲区大小。例如,从父级到子级的刷新可能会填充子级的缓冲区,并且子级可能需要进一步刷新到孙级。在这种级联刷新中,子级可能会临时分配一个比它在磁盘上最终需要的更大的内存缓冲区来保存这些消息,直到刷新到孙级。此问题主要影响发出小写入的工作负载,而小写入又会在刷新期间序列化更多消息。

挑战和本文优化

这篇论文展示了通过在BetrFS上引入一组优化,可以构建一个适用于普通SSD的单一完备文件系统。BetrFS在硬盘(HDD)上是一个完备的文件系统,在最差情况下与最快的Linux文件系统相匹配,在最好情况下,性能提高了两个数量级。

  • 整合层次结构。BetrFS的Bε树堆叠在ext4之上,使用ext4作为块分配器,这种堆叠在HDD上成本可接受,但在SSD上不可接受。本文提出了一种简化的底层存储结构,用于更快设备上的内核中的写优化键值存储。在许多情况下,为了明确各层次之间的工作分工,需要修改键值存储以不同的方式实现功能,例如将预读取移到键值存储层。在其他情况下,例如元数据缓存,VFS结构是专业且有效的。对BetrFS的VFS交互进行微小的更改可以更有效地批处理元数据更新,并更好地经济地进行Bε树查询。总的来说,这些改变使得顺序写入吞吐量比BetrFS v0.4提高了4倍,grep时间减少了41%。

  • 键空间范围作为第一类基元。本文提出了一些针对于键空间中连续的键值对集合的范围操作的优化。从硬盘转移到固态硬盘后,范围操作对CPU的要求太高,无法跟上更快的设备。本文为范围操作提供了额外的优化,以及对VFS缓存行为的简单更改,以消除冗余查询。这些优化加速了递归删除的速度,使得BetrFS v0.6在这个工作负载上与其他文件系统相媲美。

  • 协同内存管理。本文描述了对写优化键值存储所需的大型缓冲区进行协同内存管理的策略。为了将小的更新聚合到大的I/O中,写优化键值存储必须能够高效地分配和可调整大小的缓冲区,这些缓冲区的大小在几百千字节到几兆字节之间,因为更新的聚合方式,很难在分配时准确预测缓冲区的大小。然而,Linux内部的内核内存分配器主要针对页面或小对象进行了优化,而不是几兆字节级别的缓冲区。同样,动态调整大缓冲区的内核映射可能很昂贵,涉及到跨核心的TLB终止。通过采用新的内存管理策略,BetrFS v0.6在各方面都提高了性能,包括4KiB和4B随机写吞吐量分别比BetrFS v0.4强大的性能提高了25%和31%。

  • VFS和键值存储集成。本文描述了在VFS页面缓存和写优化键值存储之间共享版本化数据(写时复制)的策略。我们的设计支持在内存中跟踪数据块的多个版本,而不妨碍写入。这个设计通过引用有效地将页面通过键值存储的层次结构进行聚合。相对于BetrFS v0.4,顺序写吞吐量提高了6倍,将性能提高到距离SSD文件系统上最快的顺序写实现不到15%的距离。从高层次来看,这个策略可以看作是使用内核的页面缓存作为文件内容的写时复制行缓存。

我们优化后的BetrFS不仅是完备的,而且在一系列微基准测试中要么是最快的,要么在最快的通用Linux文件系统上处于15%以内。这些优化在最佳情况下将随机写入吞吐量提高了6倍,与最快的SSD文件系统相比。在最差情况下,我们的文件系统与其他基准文件系统性能相近。这些改进可以转化为应用层的收益;例如,与其他普通文件系统相比,BetrFS上的Dovecot邮件服务器和Linux源代码的rsync分别显示了1.13×和1.8×的加速。

开源代码:GitHub - oscarlab/betrfs at v0.6

实验

实验环境:4核3.00 GHz Intel Xeon E3-1220 v6 CPU,32 GB RAM的PowerEdge T130。SSD是250 GB的三星EVO 860 SSD,具有512字节的页面大小和12 GB的写缓存;我们测量用于读取的567MB/s的峰值原始顺序带宽。对于写入,当数据大小小于12 GB时,峰值带宽为502 MB/s,而当数据大小大于12 GB时则降至392 MB/s,我们将其归因于设备内部操作。

数据集:microbenchmark、应用程序、FileBench[32]

实验对比:吞吐量、延迟

总结

目标是设计在各种不同工作负载下,使文件系统在SSD上始终性能良好。作者对BetrFS进行了详细的分析,将BetrFS从HDD迁移到SSD会面临6个问题:顺序写入和过多的文件数据拷贝;小写和双重日志;顺序读取和预读;文件创建和存在性检查;递归删除和范围消息;小写入和缓冲区大小调整。

根据分析作者在4个方面进行优化:整合层次结构,提出了一种简化的底层存储结构,用于SSD上的内核中的写优化键值存储;键空间范围作为第一类基元,提出了一些针对于键空间中连续的键值对集合的范围操作的优化;协同内存管理,描述了对写优化键值存储所需的大型缓冲区进行协同内存管理的策略;VFS和键值存储集成,描述了在VFS页面缓存和写优化键值存储之间共享版本化数据(写时复制)的策略。

相关推荐

  1. 论文阅读笔记】清单

    2024-02-02 08:54:04       51 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-02 08:54:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-02 08:54:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-02 08:54:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-02 08:54:04       20 阅读

热门阅读

  1. IP 了解

    IP 了解

    2024-02-02 08:54:04      34 阅读
  2. C# 求幂算法,最大公约数,最小公倍数

    2024-02-02 08:54:04       31 阅读
  3. js寄⽣组合继承和优缺点

    2024-02-02 08:54:04       33 阅读
  4. Node.js EventEmitter详解

    2024-02-02 08:54:04       38 阅读
  5. spring boot bean的生命周期

    2024-02-02 08:54:04       25 阅读
  6. Flask 入门5 :过滤器

    2024-02-02 08:54:04       40 阅读
  7. docker-compose安装配置jenkins

    2024-02-02 08:54:04       29 阅读
  8. opencv——照片裁剪/照片斜的摆正

    2024-02-02 08:54:04       35 阅读
  9. Modern C++ idiom6 - 命名返回值优化NRVO

    2024-02-02 08:54:04       29 阅读