LWN:Btrfs如何支持zoned block device!

关注了就能看到更多这么棒的文章哦~

Btrfs on zoned block devices

April 19, 2021
This article was contributed by Marta Rybczyńska
DeepL assisted translation
https://lwn.net/Articles/853308/

zoned block devices 设备有一些不为人知的特点,都是为了提高存储密度而做出的妥协。这些设备都会被划分为若干个区域,其中一些区域(或全部区域)的写入操作不能支持随机访问。也就是说,这些 "顺序写入" 的区域只能按顺序依次写入,从第一个 block 直到最后一个 block。这种限制给文件系统带来了新的挑战,因为文件系统在设计时通常假定存储 block 都可以按任何顺序来写入。因此,Linux 中主流文件系统对 zoned-device 的支持迟迟没有出现。不过,随着 Linux 5.12 中 Btrfs 增加了对 zoned block device 的支持,这种情况正在发生变化。

要想覆盖掉某个 zoned drive(驱动器)的顺序写入区的数据,唯一方法是将写指针重置来指向到该 zone 的开头为止,这个操作就相当于擦除了该 zone 的全部内容。此外,随机读取访问是完全支持的。许多 zoned device 还提供一些支持随机读写操作的 "常规(conventional)" zone。zoned device 最早是以片状磁记录(SMR, shingled magnetic recording)驱动器的形式出现的,内核对这些设备有一些底层支持。也存在一些使用 flash 存储的 zoned device,这些都是在权衡灵活性以及更低硬件复杂性这两个因素而来的。这些设备以 the Zoned Namespaces (ZNS) command set 命令集的形式被添加到 NVMe 标准之中了,Linux 从 5.9 版本开始已经支持这些设备。

在 Linux 文件系统中支持 zoned device 的工作已经进行了好几年。Copy-on-write 的文件系统应该更容易适应这种硬件,因为这些文件系统在设计时就希望避免对数据 block 进行覆盖写入。在现有的 Linux 文件系统中,F2FS 已经支持 zoned device,支持在这种设备上进行正常的操作(但要求驱动器至少提供一个 conventional zone)。此外,zonefs,也就是一个用于 zoned device 的特殊文件系统,也被合入 5.6 内核了。使用 zonefs 需要相关的应用程序也专门经过适配,因为该文件系统不支持创建普通文件。然而,有些类型的应用程序确实很适合这种模式,例如那些 log 日志类型的数据。

近年来,更多的主流文件系统中对 zoned device 的支持也有了一些进展。Btrfs 就是其中之一,至少从 2019 年开始就有相关的工作在进行了,当时 Noahiro Aota 在 2019 年的 Linux Storage, Filesystem, and Memory-Management Summit 峰会上介绍了这项工作的状况。此后,他一直在继续这项工作,最终将修改到第 15 版的 patch 合入到了 5.12 中。

Changing Btrfs

要支持 zoned device,需要改变文件系统的 structure 在磁盘上的组织方式,因为一般来说是无法覆盖现有数据的。这也就意味着,那些随时间变化的数据结构必须要放置在传统的 conventional zone 中,或者采用一种不要求它们固定在某个位置的方式来实现。

在 Btrfs 中唯一存放在磁盘上固定位置的 structure 就是超级块(superblock),它可能有最多两个副本。在 zoned devices 的情况下一个简单的解决方案就是要求超级块及其副本存放在 conventional zone 之中。然而,在现有的许多设备上,第二个副本规定的位置位于一个 sequencial zone 之内。此外,人们也希望支持那些没有 conventional zone 的设备也应该得到支持。由于这些原因,Aota 实现了一个基于 log 的超级块方案,将两个 zone 作为循环缓冲区(circular buffer)来防止突然掉电引起故障。文件系统会将要更新的超级块内容按顺序写到第一个 zone 里,当第一个 zone 写满了之后,就切换到第二个 zone,然后就可以安全地对第一个 zone 进行重置(reset)了。

另一个需要改变的数据结构是 tree log(树状日志)。这个 log 中所用到的 block 是和其他类型的 metadata 元数据 block 一起分配的。由于 tree log 并没有跟其他元数据在相同时间写入,因此这种方法会产生非顺序写入。解决方案就是将 tree log 与其他 metadata 元数据分开,然后每个 data stream 可以单独且顺序地写入。

在底层实现中还修改了 Btrfs chunks(也称为 block groups),这是一个 Btrfs 数据结构,代表磁盘上一批 data block。在 zoned Btrfs 的情况下,修改了默认的 chunk size,从而使得它可以与 zone size 一致。为了满足 zoned-device 的要求,chunk 中 block 的分配方式也进行了修改:需要从 chunk 的开头来按顺序依次分配这些 block。如果位于分配指针之后的 block 被释放了,后续的分配中也会忽略这些 block。因此,这些 block 就总是按顺序分配的。只有当某个 chunk 中的所有 block 都被释放后,该 chunk 的区域才允许被重新使用(reset)。

除了 data-layout(数据的位置分布)相关修改之外,Btrfs 在写入底层的 zone device 的时候不会使用普通的 write 操作,而是使用 “zone append” (也就是 REQ_OP_ZONE_APPEND 这个 block-device 操作)来写入。这个操作使用时需要指定该写入哪个 zone,但并不需要写指针,而它的返回值就是所写入的 block 的地址。这意味着各个数据结构的写入顺序并不重要了,也不需要 block-groupd lock 了。Aota 在 patch 的介绍中提到的写入速度是 4KB 随机写入的 36%。

通过这组 patch set,Btrfs 就可以支持具有 ZNS 功能的 NVMe 硬盘,并且 sd 这个驱动程序可以为 SAS 和 SATA 硬盘来提供 zoned command set 命令集的模拟支持。

How it works in 5.12

目前的 zoned-device 支持方式有一些限制,以及要进一步改进的地方。大概的改进清单记录在 5.12 的 merge request 中,而完整的改进列表位于 patch 的说明中。

用户可能会碰到的第一个问题是,5.12 只支持 single 这一种 Btrfs profile。这意味着不支持数据复制(data duplication)和 RAID 等功能。支持其他 profile 的难点在于不同 zone 中相同数据位于不同的逻辑地址上。Aota 在 patch 说明中给出的例子是 DUP profile(duplicating data)。在这种情况下,当文件系统发出 append 命令时,两个 zone 可能写到不同的偏移位置。

系统管理员还应该注意,如果一个 volume 包含多个 zoned disks 磁盘,那么所有 disk 中的 zone size 需要是一样的。

目前版本的 btrfs-progs 工具还不支持 zoned device,但在 Aota 的代码仓库中可以获取拥有相应功能的代码 branch。

我测试了一个 zoned Btrfs 文件系统,以及一个普通的 Btrfs(不是 zoned device 类型),并且是在同一个 SATA 硬盘上,使用了相同大小的磁盘分区(partition)。这里的 zoned device 是模拟出来的(emulated)。要想创建一个 zoned Btrfs 文件系统,就需要使用 Aota 版本的 mkfs.btrfs 工具新增的 -Ozoned 这个选项,同时要把数据和 metadata 元数据都强制放到 "single" profile 中。

mkfs.btrfs /dev/sdb1 -O zoned -d single -m single

这两个文件系统在基本来说表现一样,并且性能也大致相同。Btrfs 的功能,如创建快照 snapshot 等,在 zoned 和 non-zoned 的设备上也都能正常工作。唯一发现的区别是在 zoned 文件系统上使用了更多的空间,这也是预料之中的。

Conclusions

zoned block device 的行为与传统的设备很不一样,所以文件系统需要改变数据 layout 来支持这些设备,并且这些开发工作耗费了好几个月。Btrfs 现在已经有了基本的支持,所以感兴趣的用户可以测试一下。然而,这种支持有其局限性,我们可以期待在后续内核版本中会增加更多功能。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值