灵活数据放置(FDP)概览
Source: https://www.youtube.com/watch?v=BENgm5a17ws
https://nvmexpress.org/wp-content/uploads/FMS-2023-Flexible-Data-Placement-FDP-Overview.pdf
如何配置和启用FDP 如何跨多个名称空间管理FDP资源 使用和不使用FDP的软件对驱动器进行写入的行为 FDP、分区命名空间和流之间的区别
Mike Allison,Samsung公司高级总监,NAND产品规划 - 标准部门 Chris Sabol,Google软件架构师 Ross Stenfort,Meta存储硬件系统工程师
大家好,我是Google的Chris Sabol,旁边是Meta的Ross Stenfort。今天我们将谈论灵活数据放置(FDP,Flexible Data Placement)并为大家更新我们的进展。FDP,灵活数据放置,主要关注的是如何管理和减少写放大。
什么是写放大呢?简而言之,当主机发送数据进行SSD写入时,额外写入介质的数据量。它的定义是介质上的写入数据量除以实际应用程序写入的数据量。举个简单的例子,这可能是主机写入了1MB的数据,而设备总共在介质上写入了2.5MB的数据。所以,这包括了1MB的用户数据或应用程序数据,再加上1.5MB的垃圾回收数据,这些数据已经被垃圾回收掉了。这导致了一个写放大系数为2.5。
为什么写放大是不利的呢?它会导致额外的读取和写入操作,从而影响了服务质量、性能,降低了延迟等多个方面。介质会因此而磨损,设备也会,而且需要额外的功耗来执行这些额外的读写操作。因此,如果我们处在一个写放大系数为1的世界中,那么随机写入的性能将与顺序写入相当。当你查看SSD的规格表时,你会发现随机写入性能和顺序写入性能有很大的差异。但是如果你能将这些随机写入的写放大系数降至1,那么性能差距就会显著减小。而如果你的写放大系数为5,那么你的写入吞吐量将显著降低。
改善写放大的历史可以追溯到上世纪90年代初的纳米技术固态硬盘(SSD)。当时的解决方案是预留空间(OP,Over Provisioning),您可以选择8%、20%或50%的预留空间。随着预留空间的增加,写放大自然而然地减少。但这是代价高昂的。在2007-8年左右,引入了修整提示(trim hints),允许应用程序声明:“嘿,我不再需要这些数据;我已删除了一个文件。”这有助于提高性能。而现在,到了2022年,我们有了TP 4146,灵活数据放置,它是一项提示,指示驱动器应该将哪些数据一起写入并放在一起。
那么这是怎么发展起来的呢?在Google,我们确定写放大是一个重大问题,对我们来说是一项重大成本。我们正在寻找改进的方法。我们调查了多种选项和多种策略。我们认为在介质上放置数据是关键。我们提出了这个Smart FDL提案。与此同时,Meta也有着非常相似的经历。他们将其视为减少和控制的关键因素,并得出结论放置是关键。他们提出了直接放置模式提案,并进行了工作。我们互相发现,得出了相同的结论,有着类似的问题和需求。没有人想要两个不同的标准来解决这个问题,因此我们与其他贡献者一起工作,积累了许多优秀的想法,最终的结果就是TP 4146。它已经完全通过审批,我们非常激动。
FDP概要基本上是,主机通过虚拟句柄或指针在写入命令中提供关于数据放置位置的提示。在设备端,设备根据这个提示将数据放置在块中,而不是仅根据没有额外信息的情况下选择一个块。它还必须通告这些块的大小,以便主机知道备份存储的单位是什么。功能性不会改变,读取不受影响,取消分配修整(deallocation trim)的工作方式与以前相同,安全性工作方式也与通常情况下相同。写入不必受到影响,但为了传递提示,您可以在写入命令中添加这个可选的提示。就向后兼容性而言,FDP是NVMe规范的可选补充部分。它可以在支持它的设备上启用或禁用。应用程序不需要理解FDP就可以获得好处;但是,已经具有一些FDP知识的应用程序可以获得渐进或额外的好处。
我是来自Meta的Ross Stenfort,我将继续探讨软件方面的内容。这个标准非常出色,但它也需要开源软件和生态系统的支持来构建。因此,我想讨论一些生态系统方面的话题。Linux内核已经得到更新,具备了完整的I/O透传支持。xNVMe也提供了全面的支持。QEMU也已全面支持。我们还为FIO添加了支持,而且我相信将来还会添加更多的支持。NVMe CLI是一款常用的实用程序,用于管理驱动器;它已经更新。Cachlib目前正在进行更新,相关的拉取请求已经提交。生态系统正在迅速发展。我知道无论我走到哪里,我总是听到有关FDP的不同场景,因此我鼓励大家思考一下如何将其应用到您的场景中以获得好处。有了这些,我将把话筒交给我们的下一位演讲者。
大家好,我是Mike Allison,我在Samsung工作,担任高级总监,负责标准工作。我是Flexible Data Placement(FDP)的主要作者。这意味着我进行了大量的撰写工作,并在这个过程中进行了一些架构工作。但实际上,这是一项合作工作,需要有需要的客户、所有SSD供应商的贡献,操作系统的贡献,最终形成了最终得到批准的TP(技术提案)。它来自操作系统方面,来自供应商,来自客户,它确实是一个巨大的合作。如果你查看这个TP,你会看到主要的贡献者名单。这是一个完整的名单;我们只是在这里代表它。我只想说,我们不是唯一的贡献者;这是一个真正的NVMe Express合作,所有会员都参与其中,和大家一起合作真的很愉快。我添加了所有这些内容,你刚刚听到了所有这些。但是我要道歉;我真的很想在昨天早上就拿到这个演示文稿,因为你们都听说了很多关于Flexible Data Placement的内容。一年前,我们在这里,TP还没有得到批准,我们向你们提供了一个概述,但我们不能告诉你们太多,因为我们正在进行最后的阶段。现在它已经得到批准,所以现在我们将讨论具体内容。我们争论了很多关于这个东西应该叫什么的问题。你们不会相信在标准中有时会花多少时间来解决这个问题,但它的一个关键特性是向后兼容性。这意味着你可以拿到从制造商那里发货的FDP禁用的设备,你可以启用它,插入到不知道FDP的服务器中,它将工作并且表现得与今天的传统NVMe驱动器一样。
当你对不同的命名空间进行写操作时,它会像今天一样将它们混合在介质上。但现在你可以根据自己的选择更改你的软件,说:“我想利用FDP。”它只是在你看之前的其他事情时给你一些灵活性,比如Streams和ZNS。它为你提供了一些灵活性,在以前没有这种灵活性。我有一张幻灯片,我将在其中进行比较,但我只是想让你知道,我相信如果没有Streams或ZNS来找出我们想要位于中间的地方并将这种灵活性提供给主机以及提供资源的时间和何时进行更改,我们就无法获得FDP。
让我们深入了解基本架构。从根本上讲,我们有回收单元,值得注意的是,我没有给它们编号,因为这些不会暴露给主机。但它们在回收单元上有大小,这些大小由主机提供,以表示“这是我拥有的由物理NAND支持的存储,大小如此”。SSD供应商的一个要求是,这个大小必须与擦除块的边界对齐。这可以是一个擦除块,也可以是多个擦除块。如果你听说过超级块,你可以从每个Die中取一个块,那也可以是一个超级块。这种架构允许SSD供应商表示:“这是我支持的FDP配置。”因此,如果你有特定的FDP配置,客户和供应商需要合作来确保它的创建。我们采用这种方法的一个原因是,你知道,我们必须从NVMe供应商那里测试这些设备,如果我们允许主机看到所有这些配置,或者无论什么配置,我们都要测试,但它们有数百个配置,我们需要进行产品交付。我认为随着生态系统的发展,我们将对几个关键的FDP配置进行调整。但是我们希望这种架构具有灵活性,以便随着时间的推移,我们可以开发出未来的功能。
接下来,我们允许将回收单元分组到回收组中,这种架构允许支持一个或多个回收组。因此,举例来说,如果你像今天的传统SSD一样使用超级块,那么它们有一个回收组,而每个回收单元都是一个超级块。或者你可以说,“不,我想要多个回收组,也许我想为每个Die创建一个回收组”。现在我可以将Die暴露给主机,主机可以告诉它们在哪里写入Die。但是随之而来的是,如果你正在写入所有的Die,那么你就需要在Die之间分发数据,因为如果你不这样做,耐久性就会变得混乱,我们必须保护自己等等。因此,如果主机愿意,主机可以承担一些责任,或者你可以让控制器负责在设备内分发数据的某些责任。因此,我们在两个方面都获得了真正的灵活性。
我们引入了这些被称为回收单元句柄的东西,实际上它们是用于执行写入操作的写入资源。这是我们缓冲数据的地方,因为当写入操作进来时,如果有单个逻辑块地址(LBA),而它没有与NAND的写入对齐,我们会将其缓冲,然后一旦我们从写入操作中收集了足够多的LBA,并且它与我们写入NAND的方式匹配,那么我们就会将其写入NAND。那么现在真正发生的事情是,这些回收单元句柄具有指向回收组中每个回收单元的指针。但是需要注意的是,不同的句柄必须指向不同的回收单元,因为这样它们就会写入NAND的不同部分。
让我们深入了解一下耐久性组。在NVMe中,耐久性组已经存在了一段时间。实际上,它的含义是,对于典型的SSD,一个耐久性组表示“这就是我的SSD中的所有NAND”。但是我可以创建一个设备,其中包含两种不同类型的NAND,然后将它们放入两个不同的耐久性组中,它们可以独立管理,可以具有不同的FDP配置,我仍然可以独立地使用FDP。如果愿意,我可以独立启用它们。因此,我们引入了这个耐久性组的概念,因为我们要讨论的是控制器将管理其中的NAND,因为我们仍然必须满足保修要求,仍然需要管理耐久性。但如果主机选择不这样做,设备仍然具备执行这些操作的能力。
我已经提到了FDP配置,但最重要的部分是,我们改变了所有的写命令,现在写命令需要指定要写入的回收单元句柄和回收组。这就是所谓的放置,如果你跟踪回收单元句柄实际引用的特定回收单元,那就是写入发生的地方,也就是提示的含义,也就是放置。
另一方面,既然我拥有这些回收单元句柄,那我应该如何使用它们呢?当命名空间被创建时,每个命名空间都可以说明要使用哪个回收单元句柄。它也可以选择不说明;向后兼容性意味着我仍然可以创建一个关于FDP和回收单元句柄的命名空间。控制器将为你提供至少一个条目,这是我们实现向后兼容性的方式,因为随着写命令的到来,我们现在有了一个指示,告诉我们在哪里放置回收单元句柄和哪个回收组。当写命令到达时,如果你没有明确说明,我们将始终使用第零个条目。这保证了设备的向后兼容性。但是命名空间可以提供一个允许的回收单元句柄(RUH)列表,这样,当主机对该命名空间进行写入时,它可以从中选择一个回收单元句柄。现在,回收单元句柄可以以任何顺序排列,都没有关系。因此,我们实际上对它们有一个索引。当命令到达时,我们使用这个索引。其中一个原因是,如果需要验证命令,我们不希望命令中出现一个稀疏的回收单元句柄。这只会导致复杂性,因此我们希望将其保持简单。从主机的角度来看,你只需要一个基于零的索引来标识回收单元句柄。
我将向大家演示它是如何工作的。在此之前,我必须解释其中的所有内容。所以,假设我有一块使用超级块的固态硬盘,这意味着它有一个回收组。我们有四个回收单元句柄。这些回收单元句柄指向不同的回收单元,因为它们以不同的方式进行写入。回收单元0、2和3属于为此命名空间创建的,这里的红色表示我在这里写入了特定的部分。回收单元0已经写入完成,R3指向一个空的回收单元。回收单元1已经写入了一些数据,RUH1目前未被使用,指向一个空的回收单元,未被使用。
让我们执行一个写入命令,我要关注控制器方面发生了什么。因此,当写入命令传入控制器时,它有特定的逻辑块地址(LBA)。它要做的第一件事是查看我们之前创建的新指令,然后它会说:“嘿,我想使用放置句柄1,这是指向要使用的回收单元句柄和回收组零的索引。”在此示例中,这是我们唯一拥有的回收组。所以他会说:“啊,这就是我将用于此写入的回收单元句柄。”现在,如果你去查看回收单元2,然后查看回收单元句柄2,再查看它当前引用的回收单元3,你会发现在那个回收单元中剩下的数据并不多。因此,在这个特定的示例中,我们将从该写入中取一部分,并通过回收单元句柄和缓冲进行写入,最终它会传送到物理NAND并填满那个回收单元,使其达到容量上限。
该写入可以来自任何命名空间。我只有一个命名空间,但如果命名空间共享一个回收单元句柄,如果你愿意这样做,它也会在那里混合。但现在,因为该回收单元已经填满容量,控制器会自动选择一个新的空的回收单元句柄来进行写入。这是与ZNS(区域命名空间)的一个不同之处。在ZNS中,当你写入区域时,你必须始终写入该区域;你不能越过边界。在FDP中,如果你继续写入,我们会跨越边界。
如何获得写放大的好处呢?任何写入到容量的那些回收单元,如果主机管理了写入到那里的逻辑块地址(LBA),并且如果主机重写了那些逻辑块地址(LBA)或完全释放了它们,当需要使用该回收单元进行将来的写入时,控制器无需复制仍然存在的任何有效数据。它只需擦除NAND并继续前进。这就是我们如何消除写放大的方法。因此,如果你使用FDP,你就是在管理逻辑块地址(LBA)。与流相比,FDP会向你提供有关你正在指向的回收单元中可以写入多少数据的反馈。流是设置一次并继续运行;如果你的对齐出现偏差,你没有反馈,因此你不知道是否从流中获得了好处。因此,我们意识到我们需要反馈。这里的另一点是你不会收到错误;你总是可以继续写入,而在ZNS中,如果你尝试越过边界进行写入,你会收到错误。
从控制器的角度来看,我们接受命令并选择放置句柄。如果主机没有告诉我放置句柄,我将使用放置句柄零。如果他们告诉了我放置句柄,我知道回收单元句柄,我知道我要写入的位置,我会更新所有的设置,然后继续执行下一个命令,一遍又一遍地执行。真正妙的是,今天我可以交付一个启用了FDP的具有一个回收单元句柄的固态硬盘,你只需将其插入,它将表现得像今天的传统NVM固态硬盘一样。因此,作为供应商,我有选择,我可以只使用FDP,如果我想要设计FDP并交付它,给你提供旧行为和新行为的体验。
我有这张幻灯片,我不会详细讲解。这是将流与灵活数据与ZNS进行比较。两种方式都有优缺点。你将看到,灵活的数据放置和流在某些方面是相同的,而ZNS和灵活的数据在某些方面是相似的,但它们都不相同。我已经介绍了这个问题的关键点。这在幻灯片中提供,如果你想进行比较,可以查看。
这就是我的演讲的结束,如果你以后有任何问题,我们将继续进行重点演示,然后在最后一起回答问题。
---【本文完】---
近期受欢迎的文章:
我们正处于数十年未见之大机遇中
新技术爆发式发展,催生新产品
然而,颠覆式创新并非简单的技术堆叠
而是异常复杂的系统工程
需要深度洞察
欢迎一起分享思考和见解