查看原文
其他

SSD写放大问题:ZNS和FDP技术的比较与选择

常华Andy Andy730 2024-03-16

Source: Chris Mellor, Using SSD data placement to lessen SSD write amplification, August 14, 2023

目录:
  • 正文

  • 附录1:分区式SSD

  • 附录2:SMR(叠瓦式磁记录技术)

  • 附录3:Javier González 的解读

  • 附录4:PPT <NAND Data Placement - Landscape, Trade-Offs, and Direction>

  • 附录5:PPT<Hyperscale Storage Perspectives>


ZNS(分区命名空间,Zoned Name Space)和FDP(灵活数据放置,Flexible Data Placement)用于更精确地在SSD上定位数据,从而延长其工作寿命并提高性能。它们是如何工作的?这两种技术都会得到应用,还是会有一种会主导行业?

ZNS和FDP技术使SSD所在的服务器能够指示其控制器数据的放置位置,从而减少在控制器回收已删除空间以供重用时所需的写入操作。

之所以需要这样做,是因为SSD的写入和删除数据过程之间存在不匹配,这导致SSD在内部写入的数据量比实际发送到它的数据量要多。这被称为“写放大”。如果向SSD写入1MB的数据,而它在内部写入了2.5MB的数据,则其写放大因子(WAF,Write Amplification Factor)为2.5。由于NAND存储单元的工作寿命是固定的 —— 就是可以对其写入数据的次数而言 —— 因此尽量减少写放大因子是可取的。对于那些可能拥有数千个SSD的超大规模数据中心来说,尤其如此。

写放大

SSD的存储单元被划分成块(block)。这些块又被细分为4KB到16KB的页(page) - 具体数量可能取决于SSD的容量,可能有128个、256个,甚至更多页。

数据是以页级别写入的,写入空页中的空单元。不能用新数据覆盖现有或已删除的数据。必须首先擦除已删除的数据,而SSD无法在页级别擦除,而是通过将整个块的页和单元设置为“1”来擦除数据。新数据(传入SSD)写入空页中。当一个SSD是全新且空的时,所有块及其组成页都是空的。一旦SSD中的所有页都被写入过一次,那么只能通过从包含已删除数据的块中恢复页(从中删除了数据或进行了擦除)来创建空页。

当SSD上的数据被删除时,数据占用的单元的标志被设置为过时或无效,以便后续尝试读取该数据失败。只有在包含这些页的块被擦除时,数据才实际被擦除。

用SSD的术语来讲是页被编程(写入)或被擦除。NAND存储单元在经过多次编程/擦除或P/E循环之后就会损坏。例如,TLC的NAND可以支持3000到5000个P/E循环。

随着SSD的使用,其中的一些数据被删除,包含这些数据的页被标记为无效。它们现在包含垃圾,可以这么说。SSD控制器希望恢复无效页,以便可以重新使用它们。它通过在块级别执行此操作,将块中的所有有效页复制到具有空页的不同块中,重新编写数据,并将源页标记为无效,直到该块仅包含无效页为止。然后,块中的每个单元都被设置为“1”。这个过程被称为垃圾回收,数据的额外写入被称为写放大。如果没有发生这个过程,写放大因子(WAF)将为“1”。

一旦整个块被擦除(这需要时间),它就可以用来存储新传入的数据。通过减少需要运行垃圾回收过程的次数,可以最大化提高SSD的响应速度。

这个过程在SSD内部进行,并由SSD控制器作为后台进程执行。目的是不干扰前台数据读写活动,并始终有新的页可以存储传入数据。

写放大是导致SSD工作寿命缩短的特性。

不同页的老化(磨损)速度不同,通过均衡所有页和块的磨损,可以最大程度地延长SSD的工作寿命。

如果特定块经历了大量的P/E循环,它们可能会损坏,SSD的容量实际上会减少。ZNS和FDP都旨在减少写放大。

ZNS

使用SSD的应用程序可以被描述为处理短生命周期数据或长生命周期数据,以及是读密集还是写密集。当一个SSD被多个应用程序使用时,这些I/O模式会混合在一起。如果闪存控制器知道它正在被给予什么类型的数据来写入,那么它可以更好地管理写入操作,以最大化SSD的耐久性。

其中一种方案就是ZNS概念,它适用于具有叠瓦式磁记录技术(Shingled Magnetic Recording)和SSD的顺序写入数据。FDP概念则没有这个限制,适用于NVMe设备 - 主要是指SSD。

分区式SSD将其容量分成单独的命名空间区域或分区,用于不同IO类型和特性的数据 —— 如读密集型、写密集型、混合型、JPEG、视频等。数据只能以顺序方式附加到分区中的现有数据。

必须擦除分区的单元才能对其进行重写。不变的数据可以放入分区中,并保持不受干扰,无需对这些块应用垃圾回收。

主机应用程序需要告诉SSD要将数据放置在哪些分区中。事实上,使用SSD的所有主机应用程序都需要向控制器提供分区信息。

FDP

NVMe组织正在努力将FDP添加到NVMe指令集中。这一努力得到了Meta的开放计算项目和Google的支持,因为拥有数千个SSD的超大规模数据中心希望这些设备的工作寿命更长,并在老化过程中保持其响应性。

Google软件架构师Chris Sabol和Meta的存储硬件系统工程师Ross Stenfort在OCP全球峰会上的FDP演示中揭示,Google和Meta各自正在开发他们自己的FDP方法,并将它们结合起来以提高效果。与ZNS类似,主机系统会告诉SSD在何处放置数据。

参考:《利用 FDP 技术解决 SSD 写放大问题

实际上,来自应用程序的数据被写入SSD的应用程序特定区域,即所谓的回收单元或块。如果没有FDP,来自多个应用程序的数据将被写入所有块中。当一个应用程序释放(删除)其数据时,所有块都必须进行垃圾回收以回收已删除的空间,此示例中的写放大因子(WAF)约为3。

有了FDP后,只有一个块会被擦除,WAF更接近于1。这减少了垃圾回收的量,延长了驱动器的耐久性,并帮助最大程度地提高其响应性。另一个好处是对驱动器上的闪存需要更少的超额配置,从而降低了成本。

三星的Javier González本月在圣克拉拉举办的FMS 2023活动上就FDP进行了演示,他的幻灯片和解读在文末。

他说,FDP和ZNS是一系列旨在降低SSD写放大的举措中的最新举措,幻灯片显示:

在三星的测试中,应用于RocksDB工作负载的ZNS展现出略微优于FDP的WAF降低效果。

他说,ZNS和FDP都有潜在的作用。关于ZNS:“如果你从零开始构建一个应用程序,并且能够保证(i)顺序写入,(ii)固定大小的对象,(iii)写入错误处理,以及(iv)一个健壮的I/O完成路径,用于处理匿名写入(如果你正在使用在Linux中是强制性的Append命令),那么ZNS可能是正确的选择。你将实现端到端WAF为1,并获得ZNS设备提供的额外TCO优势。”

然而,“ZNS是一个明确严格的接口。要么获得全部好处,这些好处相当丰富,要么一无所获。”

FDP有所不同:“如果你正在对现有应用进行改造,其中(i)写入不总是顺序的,(ii)对象可能具有不同的大小,以及(iii)I/O路径依赖于现有的、稳定的软件,则FDP可能是你的最佳选择。”

他写道:“我们通过为RocksDB、Cachelib以及最近的XFS(四周后仍在进行中)构建支持的经验告诉我们,在不进行主要应用程序更改的情况下,实现前80%的效益是现实的。”

他认为这两种技术都可以共存,但认为其中一种将占主导地位并扩展到不同的场景。

在SSD硬件和软件供应商与用户生态系统中,ZNS需要更多的工程支持,而FDP需要较少的来自面向应用程序的生态系统的工程支持。

Gonzalez认为,这两种技术中只有一种将获得主流应用,但他不知道哪种。ZNS最适合以完全顺序写入为基础的应用程序,而FDP则更适合于开始在其软件生态系统中部署数据放置的用户。

========

附录1:分区式SSD

分区式SSD将其容量分成单独的命名空间区域或分区,用于不同IO类型和特性的数据 —— 如读密集型、写密集型、混合型、JPEG、视频等。数据只能以顺序方式附加到分区中的现有数据,以顺序方式进行写入。通常,分区管理软件将小写入聚合在一起(分批处理),以4KB的块为单位进行写入操作。分区必须被擦除,才能对其单元进行重写。这意味着在同一块中的小数据项被删除时,不会干扰不变的数据块 —— 否则会最终触发垃圾回收过程。所有这些都有助于更好地管理闪存和提高耐久性。


附录2:SMR(叠瓦式磁记录技术)

一种磁盘和磁带驱动器的数据记录技术。在磁盘驱动器的分层式记录中,写入轨道部分重叠,留下较窄的读取轨道,以增加每个盘片的容量。写入轨道被分组成块,块之间由间隔区分开。重新写入数据是一个顺序过程,涉及块内轨道的擦除和写入,与非分层驱动器相比,这会减慢写入过程。


附录3:Javier González 的解读

这次演讲的核心信息是,数据放置(Data Placement)仍然是一个尚未解决的存储问题。在过去的几年中,我们已经看到了一些新技术试图通过不同程度的主机干预来解决这个问题(如Open-Channel SSD、Streams、KV、ZNS以及最近的FDP),然而似乎总是有进展,却没有一个长期稳定的解决方案。我们认为,这主要是因为与更改主机堆栈以采用每种数据放置技术来适应现有应用程序相关的工程工作。

我们已经为每种方法构建了硬件和软件,并与客户共同构建了产品和POC。下面是当我们深入研究ZNS和FDP时的一些认识。

ZNS是一个很棒的接口。

如果你从零开始构建一个应用程序,并且能够保证(i)顺序写入,(ii)固定大小的对象,(iii)写入错误处理,以及(iv)一个健壮的I/O完成路径,用于处理匿名写入(如果你正在使用在Linux中是强制性的Append命令),那么ZNS可能是正确的选择。你将实现端到端WAF为1,并获得ZNS设备提供的额外TCO优势。然而,如果上述任何条件难以保证,建议你评估你的应用程序和I/O路径中需要进行的更改量。特别是如果你需要引入间接层(例如,支持原地元数据写入或可变对象大小),因为你的软件引入的WAF可能会超过ZNS的好处。我们在实际部署中见过这种情况发生。

此外,在构建这些应用程序时,请考虑你的内部支持,因为ZNS是一个明确严格的接口。要么获得全部好处,这些好处相当丰富,要么一无所获。

FDP是一个灵活的接口,能带给你80%的好处。

如果你正在对现有应用程序进行改造,其中(i)写入不总是顺序的,(ii)对象可能具有不同的大小,以及(iii)I/O路径依赖于现有、稳固的软件,那么FDP可能是你的最佳选择。你不会获得100%的好处;投资回报率将取决于你在应用程序中投入的工程工作。然而,你将能够在设备的整个生命周期内部署并进行渐进性的改变,以增加投资回报率。我们通过为RocksDB、Cachelib以及最近的XFS(仍在进行中的4周后)构建支持的经验告诉我们,达到80%的好处是现实的,无需进行重大的应用程序更改。在FMS上参加活动的人们可以在我们与Meta一起展示的演示中看到这一点。

这取决于你正在构建什么。两种接口都很棒,但它们有不同的用途。

附录4:<NAND Data Placement - Landscape, Trade-Offs, and Direction>


附录5:<Hyperscale Storage Perspectives>


---【本文完】---

近期受欢迎的文章:


我们正处于数十年未见之大机遇中

新技术爆发式发展,催生新产品

然而,颠覆式创新并非简单的技术堆叠

而是异常复杂的系统工程

需要深度洞察

欢迎一起分享思考和见解

继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存