ZNS初步认识—GPT

发布于:2025-07-03 ⋅ 阅读:(15) ⋅ 点赞:(0)

1. ZNS SSD 的基本概念

  • Zoned Namespace (ZNS): ZNS 是一种新的NVMe接口规范,它将SSD的逻辑块地址空间划分为多个独立的、固定大小的“区域”(Zones)。
  • 区域 (Zone): ZNS SSD 的基本管理单元。每个区域都有自己的写入指针(write pointer),数据只能从这个指针位置开始顺序写入。一旦写入,就不能随机覆盖,必须“重置”(reset)整个区域才能重新写入。
  • 顺序写入限制: 这是ZNS最核心的特性。在一个区域内,数据必须严格按照顺序写入,不能跳过或随机写入。如果需要修改区域内的数据,必须将整个区域的数据(包括未修改的部分)读出,修改后,再将整个区域重置并重新顺序写入。

2. ZNS 诞生的背景:传统 SSD 的挑战

理解ZNS的必要性,首先要了解传统SSD面临的问题。

  • 闪存转换层 (Flash Translation Layer, FTL):
    • 作用: 传统SSD内部有一个复杂的FTL层,负责将主机发出的逻辑块地址(LBA)映射到NAND闪存的物理块地址(PBA)。它隐藏了NAND闪存的底层复杂性,使SSD表现得像一个传统的块设备(可以随机读写)。
    • 挑战: FTL需要管理各种复杂任务,如:
      • 磨损均衡 (Wear Leveling): 确保所有NAND块均匀磨损,延长SSD寿命。
      • 垃圾回收 (Garbage Collection, GC): NAND闪存只能以页(page)为单位写入,但只能以块(block)为单位擦除。当一个块中的某些页数据失效后(被更新或删除),这个块就变成了“脏块”,其中包含有效数据和无效数据。GC就是将脏块中的有效数据读出,写入到新的干净块中,然后擦除(回收)整个脏块。
      • 写入放大 (Write Amplification, WA): GC过程会导致实际写入NAND的数据量大于主机发出的写入量。例如,主机写入1个页的数据,但为了GC,控制器可能需要移动并重新写入多个页的数据。WA是实际写入闪存的数据量与主机写入数据量的比值,WA越高,SSD寿命越短,性能越不稳定。
      • 过量配置 (Over-Provisioning, OP): 为了给FTL和GC提供足够的空间来管理数据和进行后台操作,SSD厂商通常会在SSD内部预留一部分空间不暴露给用户,这就是OP。OP越高,WA越低,性能越稳定,但用户可用容量越小。
  • 传统SSD的弊端:
    • 性能不确定性: GC是后台操作,发生在不可预测的时间,导致随机写入性能波动大,有时会出现“卡顿”现象。
    • 写入放大: 导致SSD寿命缩短。
    • 高功耗: 复杂的FTL和GC逻辑需要更多功耗。
    • 高成本: 需要更多的NAND颗粒(用于OP),复杂的控制器芯片。

3. ZNS SSD 的工作原理

ZNS通过改变主机与SSD的交互方式来解决上述问题,将部分闪存管理职责上移到主机端。

  • 区域 (Zone) 的结构和状态:
    • 每个区域有固定的容量,例如256MB、512MB或1GB。
    • 每个区域有唯一的写入指针,指示下一个写入操作的LBA。
    • 区域状态(Zone States):
      • Empty (空): 区域中没有有效数据,写入指针位于区域的起始地址。
      • Implicitly Open (隐式开放): 区域正在被写入数据,写入指针正在移动。多个区域可以同时处于隐式开放状态。
      • Explicitly Open (显式开放): 主机通过 Open 命令明确声明要向该区域写入数据。同一时间只能有有限数量(由SSD控制器决定)的区域处于显式开放状态,通常用于保证性能。
      • Closed (关闭): 主机通过 Close 命令停止向该区域写入,或隐式开放区域在一段时间没有写入后自动关闭。写入指针停止移动。
      • Full (已满): 区域中的所有LBA都已被写入数据,写入指针位于区域的末尾。
      • Read Only (只读): 区域可能包含数据,但不能再写入。通常用于特殊数据(如固件)。
      • Offline (离线): 区域不可用。
  • 区域管理命令: 主机通过NVMe命令与ZNS SSD交互,管理区域。
    • Report Zones 获取所有区域的信息(状态、写入指针位置、容量等)。
    • Zone Append 将数据写入一个或多个区域的当前写入指针位置。这是最常用的写入方式。
    • Open Zone 显式地打开一个区域进行写入。
    • Close Zone 关闭一个已打开的区域。
    • Finish Zone 强制一个区域进入 Full 状态,即使它还没写满。
    • Reset Zone 擦除一个区域的所有数据,将其状态恢复到 Empty,写入指针回到起始位置。这是ZNS中实现“删除”或“更新”的唯一方式(通过重写整个区域)。

4. ZNS SSD 带来的优势

  • 显著降低写入放大 (WA): ZNS SSD的FTL变得非常简单甚至可以没有,因为主机负责将数据以顺序方式写入区域。当区域数据失效时,主机直接重置区域即可。GC操作大大简化,从而使WA接近于1。
  • 更可预测的性能: 由于GC活动大大减少,性能波动小,随机写入性能更加稳定。
  • 延长SSD寿命: WA的降低直接减少了NAND闪存的实际擦写次数,从而延长了SSD的耐久性。
  • 降低过量配置 (OP) 需求: 由于GC的简化,SSD内部不需要预留大量的OP空间,可以提供更高的可用容量。
  • 简化SSD固件: SSD控制器不再需要复杂的FTL和GC逻辑,可以更专注于读写性能优化。
  • 更好的主机-设备协作: 主机了解闪存的物理特性,可以根据应用的需求进行更智能的数据放置和管理。

5. ZNS 对软件栈的影响(核心挑战和研究方向)

ZNS的优势是基于其对传统块设备接口的颠覆。这意味着现有的操作系统、文件系统、数据库和应用程序都无法直接、高效地使用ZNS SSD。

  • 文件系统:
    • 传统文件系统: 例如 ext4、XFS、NTFS 等,它们假定底层存储设备是随机可写的块设备。如果直接运行在ZNS上,每次写入都需要重置整个区域,效率极低。
    • 日志结构文件系统 (LFS/LSM-Tree Like FS): F2FS, Btrfs 等日志结构文件系统,其写入模式(追加写)与ZNS的顺序写入特性更契合。它们需要进行修改和优化才能在ZNS上高效运行。
    • ZNS-aware 文件系统: 需要全新的文件系统设计,能感知区域、管理写入指针、智能地选择区域进行写入、高效地处理元数据、并在区域满或需要更新数据时智能地管理区域重置。Linux 内核中的 zonefs 是一个初步的ZNS文件系统,但功能有限。
  • 数据库和键值存储:
    • LSM-Tree 数据库 (e.g., RocksDB, Cassandra): 它们的写入操作(MemTable flush、Compaction)天然是顺序的,与ZNS特性非常匹配。需要优化其compaction策略,使其能更好地利用ZNS的区域特性,例如将L0/L1层数据直接映射到ZNS区域。
    • B-Tree 数据库 (e.g., MySQL, PostgreSQL): 它们的随机写入模式对ZNS是一个挑战。需要设计新的缓存层、WAL(Write-Ahead Log)策略或数据结构来适应ZNS,例如将WAL写入ZNS区域,而将随机更新写入一个小的常规SSD区域或PMem区域。
  • 应用程序:
    • 许多应用程序直接依赖文件系统或数据库接口。
    • 对于高性能应用,可能需要直接通过ZNS API(如 libzbd 库)与ZNS SSD交互,从而实现定制化的存储管理,最大化性能。
    • 适合ZNS的应用: 日志系统、流媒体存储、大数据分析(特别是追加写入和批处理)、版本控制系统、归档存储等。
  • I/O 栈:
    • 操作系统需要新的I/O调度器来管理ZNS设备的区域分配和写入调度。
    • 需要新的内存管理和页缓存策略,以优化数据写入ZNS。

6. 如何学习和实践

  • 阅读 NVMe Zoned Namespace Command Set 规范: 这是最官方、最详细的ZNS定义。
  • 学习 libzbd 库: 这是Linux上与ZNS SSD交互的C语言库,可以帮助你理解如何编程管理区域。
  • 使用 ZNS 模拟器:
    • Linux null_blk 模块: 这是Linux内核提供的一个非常强大的模拟器,可以模拟ZNS设备,无需真实硬件即可进行软件开发和测试。
    • QEMU 模拟器: QEMU 也可以模拟ZNS设备,用于虚拟机环境的测试。
  • 关注 Linux 内核对 ZNS 的支持: 了解 zonefs、F2FS on ZNS、ZNS block layer 等进展。
  • 阅读相关论文: 搜索FAST、USENIX ATC、OSDI、EuroSys、HotStorage等顶级会议上关于ZNS的论文,了解最新的研究进展和挑战。
  • NVMe-CLI 工具: 使用 nvme-cli 工具,特别是其 nvme zns 子命令,可以查看ZNS设备信息、管理区域等。

总而言之,ZNS SSD代表了存储系统从“设备管理复杂性”向“主机管理复杂性”的转变。这为上层软件带来了巨大挑战,但也开启了巨大的优化潜力和研究机会。深入理解ZNS的底层机制和其对整个系统栈的影响,是成功进行相关研究和开发的基石。

NAND 闪存FTL(Flash Translation Layer) 在 SSD 中的核心作用。我们一条一条地梳理清楚:

✅ 一、为什么要把逻辑地址映射到 NAND 的物理地址?

1. 主机视角:

主机(比如操作系统)通过标准的块设备接口(如 SATA 或 NVMe)访问存储设备,发出的命令是:

“我想在逻辑地址 LBA=123456 上写入这段数据。”

主机并不知道这个逻辑地址对应底层闪存的什么地方,它只管读/写某个“地址”。


2. SSD内部视角(NAND 闪存):

但 SSD 里存储数据的介质是 NAND 闪存,它有如下特点:

  • NAND 不能随机覆盖写入,只能:
    • 把数据“写到空白页”。
    • 如果想更新某个数据,只能把整块擦掉后再重写(成本很高)。
  • NAND 分为“页”(最小写入单元)和“块”(最小擦除单元):
    • 通常:页 = 4KB,块 = 256页(1MB)。

所以:

主机说:“请把数据写入 LBA 123456”

SSD 不能直接写进 NAND 对应的那个位置 —— 那里可能已经有数据,必须重写整块,非常低效。


3. FTL 的作用:

FTL(Flash Translation Layer)就像一个中介或“翻译器”,它做了这几件事:

主机 FTL NAND 闪存
LBA 123456 查表 找到一个空页,比如 Block 7, Page 42
写入数据 实际写入到该物理地址

FTL 的核心功能:

  • 建立一个 LBA → PBA(物理块地址) 的映射表。
  • 管理数据更新、GC、磨损均衡等任务。
  • 屏蔽 NAND 的写入限制,让 SSD 像机械硬盘一样“看起来可以随便写”。

✅ 二、什么是 NAND?

NAND 是一种非易失性存储器,属于闪存(Flash Memory)的一种:

类型 特点
NAND Flash 大容量、便宜、写入快、擦除复杂,用于 SSD、U盘、SD卡等
NOR Flash 启动速度快、可直接执行代码,常用于BIOS、嵌入式系统

NAND 的结构特点:

  • 分为 Block(块) → Page(页);
  • 通常一次写入一页(例如 4KB),但只能一次性擦除整个块(例如 1MB);
  • 数据写入必须是“空页写入”(不能覆盖写过的数据);
  • 具有寿命限制(每个块只能擦除一定次数)。

✅ 三、现在的 SSD 是不是还是用 NAND 存储数据?

是的。

当前主流的 SSD(无论是消费级还是企业级)几乎都使用 NAND 闪存 作为核心存储介质。以下是几种常见的 NAND 类型:

类型 每个单元存几位 特点
SLC(Single Level Cell) 1位/单元 最快、最耐用、最贵(用于缓存)
MLC(Multi Level Cell) 2位/单元 较好,企业级常用(已被TLC取代)
TLC(Triple Level Cell) 3位/单元 目前主流消费级 SSD 使用
QLC(Quad Level Cell) 4位/单元 更便宜但耐用性更差(适合冷数据)

此外,还有:

  • 3D NAND:把 NAND 堆叠在垂直方向,提升密度、降低成本。
  • V-NAND(Vertical NAND):Samsung 的 3D NAND 名称。

✅ 四、小结

解答
为什么 SSD 要将主机的逻辑地址映射到 NAND 的物理地址? 因为 NAND 的物理写入限制多,不能直接更新原位置,FTL 需要找空页写入并建立映射。
这样做是不是因为 SSD 都是用 NAND 存储数据? 是的,现在的 SSD 几乎都使用 NAND 闪存作为存储介质。
NAND 是什么? 一种非易失性存储器,是 SSD 的核心存储芯片。具有页写入、块擦除、寿命限制等特性。

网站公告

今日签到

点亮在社区的每一天
去签到