Zoned Storage-应用

ZenFS是RocksDB的文件系统插件,支持Zoned块设备,减少了写入放大并提高了性能。通过将文件分进zones并利用“write lifetime hints”,ZenFS避免了后台垃圾收集,提升了系统吞吐量、尾部延迟和耐用性。ZenFS的内部结构使用libzbd库管理zone,文件分配策略基于extent。文章还介绍了ZenFS的构建、安装、命令行工具及其在基准测试中的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RocksDB with ZenFS

ZenFS介绍

RocksDB 是用于快速存储设备的持久KV存储。 它是使用 Log-Structured Merge-Tree (LSM-tree) 数据结构实现的。 它类似于基于 LSM-tree 的键值引擎实现:值存储在按键递增顺序排序的表中。 表是按顺序写入的,从不修改。 LSM-tree 数据结构的这一基本原理使得支持zoned块设备成为可能。

RocksDB 的存储插件架构使得适应不同的存储后端成为可能。 更重要的是,ZenFS 实现了对 zoned 块设备的支持并集成到 RocksDB 中。

ZenFSRocksDB 的文件系统插件,它使用 RocksDB FileSystem [sic] 接口将文件放置到原始zoned块设备上的zones中。 通过将 files 分进 zones 并利用 **“write lifetime hints”(WLTH)**来共同定位相似生命周期的数据,与传统块设备上的常规文件系统相比,ZenFS 可以减少系统写入放大ZenFS 确保文件系统或设备上没有后台垃圾收集,从而提高了吞吐量、尾部延迟和耐用性方面的性能

ZenFS 可以使用 extent 分配策略 将多个文件存储在单个zone中。 一个文件可以由一个或多个 extents 组成,所有extents 构成的文件可以存储在设备的同一zone(或不同zones)中。 一个extent从不跨越多个zones。 当区域中的所有file extents都无效时,可以重置该zone,然后重新使用以存储新的file extents。(一个文件由于1个或多个extents组成,该文件可以存储在1个和多个zones中,1个extent不可以出现在多个zones中)

ZenFS 根据 RocksDB 库提供的**“write lifetime hints”(WLTH)** 将file extents 放置到zones中。 当 WLTH 相似时,ZenFS 总是尝试将file extents 放在相同的 zone 中。

在 ZenFS 中,数据垃圾收集仅由 RocksDB 在启动 LSM-tree 表压缩过程时执行。 ZenFS 不执行垃圾回收,ZNS 设备控制器也不执行垃圾回收。(ZenFS和ZNS SSD 控制器 本身都不提供GC机制。垃圾回收是由于KV Compaction执行的)

注意 ZNS: Avoiding the Block Interface Tax for Flash-based SSDs USENIX ATC 2021 文章中提供了更多信息。

ZenFS 内部结构

  • 架构概述
    在这里插入图片描述
    ZenFS 实现了 FileSystem的 API,并将所有数据文件存储到原始分区块设备上。 LOG和LOCK文件存储在可配置目录下的默认文件系统中。 区域管理通过 libzbd 完成,ZenFS io 通过正常的 pread/pwrite 调用完成。

  • 文件系统实现
    文件被映射到一组extents中:

    • Extents是块设备上的块对齐的连续区域
    • Extents不跨越zones
    • 一个zone可能包含多个extents
    • 来自不同文件的extent可能共享zones
  • 数据回收
    ZenFS 在当前的实现状态下异常懒惰,并且不进行任何垃圾收集。 随着文件被删除,已用容量zone计数器会下降,当它达到零时,可以重置和重复使用zone。

  • 元数据
    元数据存储在块设备的第一个zone的rolling log中。

    每个有效的元数据区包含:

    • 具有当前序列号和全局文件系统元数据的超级块
    • 文件系统中所有文件的至少一个快照
    • 增量文件系统更新(新文件、新扩展区、删除、重命名等)

Getting Started

Prerequisites

ZenFS 需要 Linux 内核版本 5.9 或更高版本。 使用的内核必须配置为zoned block device support enabled.

ZenFS 使用 libzbd 库。 在构建和安装 ZenFS 之前,必须编译和安装此库的最新版本。

构建和安装 ZenFS

ZenFS 嵌入到 RocksDB 中。 它可以作为 RocksDB 中的子模块使用,并且必须在编译 RocksDB 时显式启用。

ZenFS 项目 README 文件中维护了解释如何使用 ZenFS 编译和安装 RocksDB 的说明。

注意 请记住将块设备 IO 调度程序设置为“deadline”,以防止写入操作被重新排序。 这可以在系统引导时自动完成。

ZenFS 命令

ZenFS 提供了一个名为 zenfs 的命令行实用程序。 此实用程序用于格式化zoned设备以创建新文件系统、列出文件以及备份和恢复文件系统。

  • 创建 ZenFS 文件系统
    要创建或格式化分区块设备(例如,NVMe ZNS 设备 /dev/nvme0n1)

### 关于 `dm-zoned` 的介绍 #### 设备映射器模块中的 `dm-zoned` 设备映射器(Device Mapper)是一个 Linux 内核框架,用于管理块设备的抽象层。它允许创建虚拟块设备,这些设备可以基于其他物理或逻辑块设备构建复杂的功能[^3]。 `dm-zoned` 是 Device Mapper 中的一个特定目标类型,旨在处理分区设备上的写入操作优化。对于现代大容量 SSD 和 HDD 存储介质而言,它们通常具有内部区域划分特性,即所谓的 Zoned Block Devices (ZBD),这使得某些部分只支持顺序写入而不能随机覆盖旧数据。为了更好地适应这种新型存储技术并提高性能,Linux 社区开发了 `dm-zoned` 来作为解决方案之一[^1]。 当使用 `dm-zoned` 时,会通过识别底层设备是否为分区分块设备来决定如何管理和调度 I/O 请求。如果检测到的是一个 zone-aware 或者 zoned 型态的目标,则该驱动程序将会按照相应的规则执行读/写命令序列化控制以及重定位等动作以确保最佳效率。 此外,在初始化过程中,`dm-init()` 函数负责启动整个 Device Mapper 模块,并调用一系列必要的子功能完成设置工作;而对于具体像 `dm-zoned` 这样的组件来说,其配置参数可能涉及到指定哪些实际磁盘应当被当作带状结构看待等问题。 ```c // Example of initializing a dm-zoned target within the kernel code. static int __init dm_zoned_init(void) { // Initialization logic here... } module_init(dm_zoned_init); ``` #### 数据结构关联 在实现上,`dm-zoned` 需要依赖一些核心的数据结构来进行有效的资源管理和请求转发。例如: - **struct dm_dev**: 描述了一个低级别的块设备实例,包含了指向底层 block_device 结构体的指针以及其他元信息,如文件访问权限和名称等属性。 - **set_capacity()**: 此函数用来设定给定通用磁盘对象 (`gendisk`) 所表示的实际大小,这对于正确反映新加入系统的分区或者调整现有卷尺寸非常重要[^2]。 综上所述,`dm-zoned` 提供了一种机制让操作系统能够充分利用带有内置区域特性的现代化固态硬盘和其他类型的持久性内存装置所带来的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值