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
- 关注 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 的核心存储芯片。具有页写入、块擦除、寿命限制等特性。 |