下载本文的PDF版本 PDF

今日闪存存储

闪存能否成为存储层级结构中新层级的基础?

Adam Leventhal,Sun Microsystems

过去几年是闪存激动人心的时期。随着制造效率的提高和市场的增长,成本大幅下降;随着工艺的改进和每个单元更多比特的出现,密度得到了提高;闪存在广泛的应用中得到了采用。闪存生态系统已经扩展并继续扩展——尤其是在消费领域的U盘、相机、加固型笔记本电脑和手机方面。

然而,闪存仅在主存储市场取得了有限的成功。随着近年来闪存价格趋势变得清晰,业界预计它将在主存储领域普及,有些人甚至大胆预测旋转介质即将消亡(显然,他们并没有被磁带的顽固性所吓倒)。然而,闪存并没有达到这些高期望。将闪存引入主存储的大部分努力都以SSD(固态硬盘)的形式出现,SSD是将闪存封装成硬盘外形尺寸并旨在取代传统硬盘。这种技术很诱人,因为它不需要更改软件或其他硬件组件,但每千兆字节闪存的成本虽然下降很快,但仍然远远高于硬盘。只有少数应用程序的性能需求证明了这种支出的合理性。

虽然闪存的前景诱人,但挑战在于找到既能兼顾成本又能兼顾性能的用途。闪存不应被视为现有存储的替代品,而应被视为增强现有存储的一种手段。传统存储系统混合使用DRAM(动态内存)和硬盘;闪存之所以有趣,是因为它在成本和性能方面都处于这两个组件之间的最佳位置,因为闪存比DRAM便宜且密度更高,并且比磁盘快得多(见图1)。因此,闪存可以增强系统,形成存储层级结构中的一个新层级——也许是自1956年RAMAC引入磁盘驱动器以来最重要的一个新层级。


闪存的特性

闪存有两个不同的类别:NAND和NOR——这些名称指的是闪存单元的排列方式。NOR闪存允许随机访问,最适合随机存取存储器,而NAND必须被视为块,最适合持久存储。本文的其余部分仅考察NAND闪存,即更便宜和更常见的类型,其中又分为两种类型:SLC(单层单元)和MLC(多层单元)。SLC在每个存储单元中存储一个二进制值。二进制值通过两个阈值电压来区分。MLC支持每个存储单元四个或最近八个不同的值,对应于两个或三个比特的存储。由于其改进的寿命和性能,传统的看法是SLC最适合企业级(即非消费级)解决方案,因此我们在此关注SLC闪存,其成本、功耗、性能和寿命与DRAM和磁盘驱动器相比。

近年来,每单位存储成本是使闪存走向前沿的原因(见图2)。在本世纪初,闪存成本与DRAM成本相当;现在,闪存设备便宜得多:SLC闪存设备每千兆字节10-35美元,而DRAM每千兆字节约为100美元。成本趋势似乎正在继续扩大闪存和DRAM之间的差距。磁盘驱动器仍然比闪存便宜得多,7200-RPM驱动器每千兆字节不到1美元,而15,000-RPM驱动器每千兆字节约为3美元。

闪存的另一个令人兴奋的特性是其低功耗。随着电力成本的上升和绿色计算动力的增强,低功耗解决方案的吸引力也随之增加。虽然由于容量和接口的差异,闪存、DRAM和硬盘驱动器之间的完全准确的比较很困难,但公平地说,闪存的功耗明显低于其他系统组件,尤其是在每千兆字节的基础上。表1记录了一些典型组件的功耗,以提供每种设备类型的大致概念。

闪存的性能有点不寻常,因为它高度不对称,这对在存储系统中使用它提出了挑战。闪存块必须先擦除才能写入,这对于一个块来说需要大约1-2毫秒,而写入擦除后的闪存大约需要200-300微秒。因此,闪存设备试图维护一个先前擦除的块池,以便写入的延迟仅仅是程序操作的延迟。读取操作要快得多:对于4k,大约为25微秒。相比之下,原始DRAM甚至更快,能够在远小于一微秒的时间内执行读取和写入。磁盘驱动器延迟取决于驱动器的转速:7200 RPM平均为4.2毫秒,10,000 RPM为3毫秒,15,000 RPM为2毫秒。加上寻道时间,这些延迟会额外增加3-10毫秒,具体取决于机械组件的质量。

SLC闪存的额定寿命通常为每个块100万次程序/擦除周期。随着闪存单元受到压力,它们会失去记录和保持值的能力。由于寿命有限,闪存设备必须注意确保单元均匀受力,以防止“热”单元导致设备过早失效。这是通过称为磨损均衡的过程来完成的。正如磁盘驱动器保留备用块池用于坏块重映射一样,闪存设备通常向操作系统呈现的容量明显小于原始闪存容量,以便保留备用块(以及用于性能的预擦除块)的储备。大多数闪存设备还能够估计自己的剩余寿命,以便系统可以预测故障并采取预防措施。

当今的存储层级结构

无论是通过网络还是本地访问,主存储都可以简洁地概括为一个包含CPU和DRAM的头单元,连接到存储阵列或JBOD(只是一堆磁盘)中的驱动器。磁盘是数据的主要存储库——典型的现代数据集范围从几百千兆字节到拍字节或更多——而DRAM充当非常快的缓存。客户端通过读取和写入操作进行通信。读取操作始终是同步的,因为客户端会被阻塞,直到操作得到服务为止,而写入操作可能是同步的,也可能是异步的,具体取决于应用程序。例如,视频流可以异步写入数据块,并且仅在流的末尾验证所有数据是否已静止;但是,数据库通常使用同步写入来确保每个事务都已提交到稳定存储。

在典型的系统中,同步写入的速度受非易失性存储的延迟限制,因为写入必须在确认之前提交。读取操作首先检查DRAM缓存,提供非常低延迟的服务时间,但缓存未命中也必须等待数据在主轴周围缓慢移动。由于工作集通常大于可用的少量DRAM,因此即使是最好的预取算法也会使许多读取操作被阻塞在磁盘上。

提高延迟的一种蛮力解决方案是简单地加快盘片旋转速度以减少旋转延迟,使用15,000-RPM驱动器而不是10,000-或7,200-RPM驱动器。这将提高读取和写入延迟,但仅提高大约两倍。例如,7,200-RPM驱动器上的10-TB数据集(来自主要供应商,按当前价格计算)将花费约3,000美元并消耗112瓦;15,000-RPM驱动器上的相同数据集将花费22,000美元并消耗473瓦——所有这些都只是为了将延迟提高两倍多一点。额外的成本和功耗开销使这成为一种令人不满意的解决方案,尽管在没有明确替代方案的情况下,它已被广泛采用。

提高同步写入性能的一种重点解决方案是以电池备份DRAM的形式添加NVRAM(非易失性RAM),通常在PCI卡上。写入被提交到NVRAM环形缓冲区,并在数据异步写入驱动器时立即确认给客户端。一旦数据已提交到磁盘,就可以在NVRAM中释放相应的记录。这种技术可以极大地提高同步写入的速度,但也存在一些缺点。NVRAM非常昂贵;电池会失效(或泄漏,或更糟糕的是,爆炸);NVRAM的最大尺寸往往很小(2-4 GB)——小到工作负载可以在刷新到磁盘之前填满整个环形缓冲区。

闪存作为日志设备

闪存的一种用途是作为NVRAM的替代品,可以提高作为日志设备的写入性能。为此,您需要一种模仿NVRAM重要属性(快速、持久写入)的设备,同时避免缺点(成本、尺寸、电池电量)。但是,请记住,虽然实现良好的写入带宽相当容易,但闪存的物理特性决定了个别写入表现出相对较高的延迟。但是,可以构建一种基于闪存的设备,可以非常快速地服务于写入操作。这是通过插入DRAM写入缓存,然后通过添加超级电容器将其视为非易失性来实现的,在断电的情况下,超级电容器提供必要的电力,将DRAM中的未完成数据刷新到闪存。

许多应用程序(如数据库)可以使用专用日志设备作为提高写入操作性能的一种方式;对于这些应用程序,可以轻松地插入这样的设备。为了将闪存日志设备的好处带给主存储,从而带给广泛的应用程序,我们需要通用文件系统中的类似功能。Sun的ZFS为闪存的使用提供了有用的背景。ZFS是一个企业级文件系统,专为现代系统的规模和要求而设计,从2001年开始从头开始实施。它摒弃了文件系统位于卷管理器之上的模型,转而采用池化存储,既简化了管理,又为优化性能提供了更大的灵活性。ZFS以始终一致的方式维护其磁盘上的数据结构,消除了意外断电后进行一致性检查的需要。此外,它足够灵活,可以适应新的技术进步,例如闪存的新用途。(有关ZFS的完整描述,请参见http://opensolaris.org/os/community/zfs。)

ZFS提供了使用单独的意向日志设备(ZFS术语中的slog)的功能,同步写入可以快速写入该设备并确认给客户端,然后再将数据写入存储池。slog仅用于小型事务,而大型事务使用主存储池——很难击败大量磁盘的原始吞吐量。

基于闪存的日志设备非常适合ZFS slog。闪存设备上的写入缓冲区必须足够大,才能使带宽饱和到闪存。其DRAM大小要求——以及功耗要求——非常小。另请注意,写入缓冲区比电池备份NVRAM设备中所需的DRAM小得多。可以放在此类设备上的闪存数量实际上没有限制,但实验表明,10 GB的交付容量对于绝大多数用例来说已经足够了。

在测试系统中将此类设备与ZFS结合使用,我们测得的延迟在80-100微秒范围内。这接近NVRAM的性能,并具有许多其他优点。关于闪存的一个常见担忧是其寿命。SLC闪存的额定寿命通常为100万次写入/擦除周期,但超过几十万次后,数据保留期可能会降至几周。ZFS将以8-KB块的形式作为slog写入此设备,每次操作耗时80微秒。在具有10 GB原始闪存的设备上,这相当于大约3年不间断使用。但是,格式化容量为10 GB的闪存设备通常会保留20-50%的闪存,从而轻松地将此类设备在持续使用下的寿命延长至五年。该设备本身可以报告其预期的剩余寿命,因为它会倒数其日益减少的备用块储备。此外,数据只需保留足够长的时间,以便系统从致命错误中恢复;一个合理的标准是72小时,因此即使对于非常旧的闪存单元,几周的数据保留时间也绰绰有余,并且比NVRAM有了巨大的改进。

闪存作为缓存

此性能图的另一半是读取延迟。存储系统通常保留系统确定消费者可能访问的数据的DRAM缓存,以便它可以从该缓存而不是等待磁盘来服务读取请求。在ZFS中,此子系统称为ARC(自适应替换缓存)。确定哪些数据存在于ARC中的策略试图预测未来的需求,但由于错误的预测或因为工作集 simplemente 大于缓存可以容纳的大小——或者

甚至大于系统上最大可配置的DRAM量,读取请求仍然可能错过缓存。闪存在容量和性能方面非常适合充当内存和磁盘之间的新二级缓存。在ZFS中,这称为L2ARC。

ZFS使用大型异步写入填充L2ARC,并使用缓存从客户端无缝地满足读取请求。这里的要求与闪存完美契合,闪存本身具有足够的写入带宽和出色的读取延迟。由于这些设备可以是外部的——而不是像DRAM那样连接到主板上——L2ARC的大小仅受簿记所需的DRAM量限制(在当前的ZFS实现中为50:1的比例)。例如,四路计算机上的最大内存配置通常约为128 GB;这样的系统可以使用内部驱动器托架中的闪存SSD轻松容纳768 GB或更多。ZFS的内置校验和可以捕获缓存不一致性,这意味着有缺陷的闪存块只会导致缓存命中次数减少,而不会导致数据丢失。

在内存层级结构的上下文中,缓存通常在条目从上一层逐出时填充——在独占缓存架构中,片上缓存逐出到片外缓存等。但是,对于基于闪存的缓存,写入延迟非常差,以至于系统很容易因等待逐出而陷入困境。因此,L2ARC使用提前逐出策略:它聚合ARC条目并预测性地将它们推送到闪存,从而分摊大型操作的成本,并确保在从ARC逐出条目时不会产生额外的延迟。L2ARC在其空间中以环形方式迭代,一旦到达末尾就返回开头,从而避免任何潜在的碎片。虽然这种技术确实意味着L2ARC中可能很快被访问的条目可能会被过早覆盖,但请记住,最热门的数据仍将驻留在基于DRAM的ARC中。ZFS将缓慢写入L2ARC,这意味着它可能需要一些时间来预热;但是一旦预热,它应该保持预热状态,只要写入缓存的速度能够跟上系统上的数据更改即可。

值得注意的是,到目前为止,L2ARC甚至没有利用通常被认为是闪存关键特性的特性:非易失性。在正常操作下,L2ARC将闪存视为廉价且庞大的存储。但是,当它写入数据块以填充缓存设备时,L2ARC会包含一个目录,以便在断电后可以识别缓存的内容,从而预热缓存。虽然重置很少见,但系统故障、断电和因维护导致的停机都是不可避免的;即时预热的缓存减少了系统在重置后典型的缓慢性能提升。由于L2ARC缓慢写入其闪存设备,并且系统上的数据可能会非常快速地修改(尤其是在使用闪存作为日志设备的情况下),因此L2ARC的内容可能无法反映与磁盘上存储的数据相同的数据。在正常操作期间,已更改和过时的条目会被标记为此类,以便被忽略。但是,在系统重置后,虽然可能会从缓存设备中读取过时的数据,但设备上保留的元数据和ZFS的内置校验和用于识别这种情况,并通过从磁盘读取正确的数据来无缝恢复。

对于工作集大于DRAM容量的情况,闪存提供了一种比任何速度的磁盘都快得多的访问工作集的方式。即使对于可以舒适地放入DRAM的工作集,如果不需要DRAM的绝对性能,那么减少主ARC的DRAM并改为将数据缓存在闪存上可能更经济。由于闪存的这种使用方式与其自然优势完美契合,因此可以非常便宜地生产合适的设备,并且仍然比快速磁盘具有显着的性能优势。虽然闪存仍然比快速磁盘的每单位存储成本更高,但在大多数情况下,即使在闪存中缓存非常大的工作集也比将所有数据存储在快速磁盘上更便宜。

闪存的影响

通过结合使用闪存作为意向日志来减少写入延迟,并使用闪存作为缓存来减少读取延迟,我们可以创建一个性能远高于其他同等成本系统且功耗更低的系统。现在可以构建具有精确混合的写入优化闪存、用于缓存的闪存、DRAM和廉价磁盘的系统,这些系统专门设计用于为任何给定的工作负载实现成本和性能的适当平衡,数据由层级结构的适当级别自动处理。还可以通过定向而非通用解决方案来解决特定的性能问题。通过使用更智能的软件,我们可以构建集成不同技术的系统,以提取每种技术的最佳质量。此外,更智能的软件的使用将使闪存供应商能够构建针对特定问题的解决方案,而不是粉饰闪存以适应硬盘的过时限制。ZFS只是众多示例之一,说明如何将闪存用作日志和缓存来提供总体系统性能。最普遍而言,这个新的闪存层可以被认为是HSM(分层存储管理)的一种激进形式,而无需显式管理。

虽然这些解决方案提供了将闪存集成到存储系统的具体方法,但它们也提出了一些问题,并迫使我们重新考虑系统的许多方面。例如,我们应该如何将闪存连接到系统?SSD显然是一种简单的方法,但可能存在更快的接口,例如内存总线。更广泛地说,这将如何影响系统的平衡?随着更多请求从闪存获得服务,可能会有可能为系统配备比磁盘总线连接更多的客户端网络连接。

从这个角度来看,闪存开启了使用更慢、更便宜、更节能的磁盘的可能性。我们现在可以嘲笑15,000-RPM驱动器是针对各种问题的一种不明确的折衷方案,但同样的论点是否可以应用于7,200-RPM驱动器?仅仅因为它处于性能曲线的低端并不意味着它处于底部。5400-RPM驱动器在今天非常普遍,并且功耗更低。3600-RPM驱动器的回归还会远吗?电力成本持续上涨,但即使这种趋势趋于平稳,存储系统的总拥有成本的很大一部分也直接与其电力使用有关——更不用说市场对绿色设计的日益重视。闪存提供的解决方案要求我们重新思考如何构建系统,并挑战我们开发更智能的软件来驱动这些系统;结果将是更快、更便宜且更绿色的系统。

致谢

感谢Neil Perrin开发slogs,感谢Brendan Gregg开发L2ARC,感谢Jeff Bonwick和Matt Ahrens使用ZFS重新发明存储。我还要感谢Bryan Cantrill、Matt Amdur和Beverly Hodgson对本文的认真审阅。

喜欢它,讨厌它?请告诉我们

[email protected]

ADAM LEVENTHAL是Sun公司Fishworks高级产品开发团队的工程师。他是DTrace的三位作者之一,他和他的同事因此获得了Sun公司2004年技术卓越主席奖。他被《InfoWorld》评为2005年创新者之一,并在2006年《华尔街日报》创新奖中荣获最高荣誉。Leventhal于2001年毕业于布朗大学,获得数学和计算机科学学位,并以优异成绩加入Sun公司。

© 2008 1542-7730/ 09/0200 $5.00

acmqueue

最初发表于Queue vol. 6, no. 4
数字图书馆中评论本文








© 保留所有权利。

© . All rights reserved.