自 1996 年以来,NAND 闪存密度每年翻一番。三星宣布其 32 千兆位 NAND 闪存芯片将于 2007 年上市。这与黄昌圭的闪存增长模型 1 相符,即 NAND 闪存密度在 2010 年之前每年翻一番。黄最近将 2003 年的预测延长至 2012 年,暗示密度是目前的 64 倍——每芯片 250 GB。这令人难以置信,但自他 2003 年发表文章(当时 2 GB 芯片才刚刚出现)以来,黄和三星已经实现了 16 倍的增长。因此,我们应该为闪存驱动器达到太字节(!)的那一天做好准备。正如黄在他的文章中指出的那样,推动这项技术的不是 PC 生态系统,而是移动和消费应用。
这些芯片中的几个可以封装成磁盘替代品。三星有一款 32GB 闪存盘(NSSD-NAND 固态盘),目前采用 PATA(并行高级技术附件),很快将采用 SATA(串行 ATA)。它采用标准的 1.8 英寸和 2.5 英寸磁盘外形尺寸,可以作为标准的小尺寸磁盘插入 PC。其他几家供应商也提供类似的产品。铼德宣布推出 16GB 闪存盘,售价 170 美元,稍后将推出 32GB 磁盘,而 SanDisk(收购了长期为军方生产闪存盘的 msystems)推出了一款 32GB 磁盘,售价约为 1,000 美元。
这些“磁盘”价格昂贵(网络标价为 1,800 美元,2 170 美元的型号尚未上市);但是,它们的功耗大约低 15 倍(0.9 瓦 vs. 14 瓦),并且(可能)每秒提供的访问次数大约是高性能 SCSI 磁盘的 10 倍(2,500 vs. 200 IOPS)。它们的抗冲击性也很高(>1 公斤)。通过良好的工程设计,它们规避了闪存的两个缺点:(1)闪存的特定字节只能写入 100 万次;(2)不能向页面写入零,因此必须先擦除(重置)页面为全一,然后再写入——这使得写入速度变慢。图 1 中显示的系统图暗示了三星实现这一目标的一些方法。
Tom’s Hardware 对三星产品进行了出色的评测。3 微软研究院的两篇文章测量了几款 USB 闪存驱动器,4,5 但我想用我们的工具(SqlIo.exe 和 DiskSpd.exe)进行一些测试。Aaron Dietrich 让我访问了一台运行 32 位模式 Windows Vista RC2 Build 5744 的双核 3.2 GHz Intel x86 机器,该机器配备 1 GB 内存和一个 beta NAND 闪存 32 GB 磁盘,Dennis Fetterly 让我访问了一个 4 GB msystems UFD Ultra USB 设备。
我使用 SqlIO.exe 和公共领域的 DiskSpd.exe 测试了读写操作的顺序和随机性能。两者都给出了相当的结果,所以我在这里报告 DiskSpd.exe 的数字,因为你可以看到代码,也许可以更改它。
顺序测试运行一分钟,在各种块大小(从 512 字节到 1 MB)上使用读取或写入操作,以及 1、2 或 4 个未完成的 I/O——也就是说,DiskSpd 发出 N (= 1、2、4) 个 I/O。当一个完成时,我们再发出一个,直到完成。在顺序测试中,每个后续的 I/O 都转到由 genfile -r128 -s- -b4096 80M test.dat 生成的 1 GB 文件中的下一个块。
随机 I/O 测试遵循相同的模式,只是它们将每个 I/O 发送到文件中随机选择的块对齐位置。msystems 的性能不如其他产品,所以我报告表 1 中更好的数字。
图 2 中的图表说明了问题。设备的顺序读写性能非常好。在深度为 4 的 512 KB 请求下,设备每秒处理 6,528 个读取请求(!)或每秒 1,644 个写入请求。读取性能明显优于写入性能。顺序吞吐量在超过 128 KB 请求后趋于平稳,读取为 53 MBps,写入为 35 MBps。
随机 I/O 的情况更加复杂——而且令人失望。对于典型的深度为 4 的 8 KB 随机请求,读取性能非常出色,达到每秒 2,800 个请求,但写入性能却令人失望,只有每秒 27 个请求。显然,随机写入性能存在问题。正如下一节所示,Windows 正在执行同步写入,并且设备写入延迟相当长(30 毫秒)。
默认情况下,在 Windows Vista 中,磁盘必须将数据写入非易失性存储器,然后才能确认写入完成。某些系统具有电池后备磁盘缓存,因此可以更快地响应,而一些愚蠢的人只是启用了此缓存——例如,它在我的笔记本电脑上已启用五年,至今没有不良影响(到目前为止)。
要承担此风险,请转到“开始”→→“计算机”→→“管理”→→“设备管理器”→→“磁盘驱动器”,然后右键单击要冒险的磁盘。从菜单中选择“属性”,然后选择“策略”选项卡,并在阅读警告标签后,选择“启用高级性能”。此页面有点令人困惑:它说您无法修改 WCE(写入缓存启用)性能,但随后它为您提供了两个执行此操作的单选按钮。
当我选择“高级写入性能”时,我期望看到出色的性能——但事实并非如此。我始终无法获得良好的写入性能。这可能是设备驱动程序或设备的问题。《高性能闪存盘设计》6 一文解释了这个问题并提供了解决方案。显然,磁盘控制器中的一点智能可以缓冲写入,并提供与顺序写入获得的每秒 1,100 个 I/O 相当的性能——但这并不是我在当前的软硬件配置中看到的。
我的测试和其他几个人的测试表明,闪存盘每秒可以提供约 3,000 次随机 8 KB 读取,经过一些重新设计,每秒可以提供约 1,100 次随机 8 KB 写入。事实上,看起来单个闪存芯片可以提供接近这样的性能,而且“盒子”内部有很多芯片——因此实际限制可能是四倍或更多。然而,即使是当前的性能,对于许多企业应用来说也非常有吸引力。例如,TPC-C 基准测试的读取和写入大致相等。使用图 2 中的图表,深度为 4 的 8 KB 随机读取速率(2,804 IOPS)和深度为 4 的 8 KB 顺序写入速率(1,233 IOPS)的加权平均值,得出调和平均值为 1,713 IOPS(深度为 1 时为 1,624 IOPS)。TPC-C 系统配置为每个 CPU 约 50 个磁盘。例如,最新的 Dell TPC-C 系统有 90 个 15,000 RPM 36 GB SCSI 磁盘,成本为 45,000 美元(维护费用额外 10,000 美元,可以“打折”)。这些磁盘占系统成本的 68%。它们提供约 18,000 IOPS。这与 10 个闪存盘的每秒请求数相当。因此,如果数据可以容纳在 320 GB 上(事实并非如此),我们可以用 10 个 NSSD 替换这 90 个磁盘。这将节省大量资金和电力(1.3Kw 的电力和 1.3Kw 的冷却)。
目前的闪存盘采用 16 GB NAND 闪存构建。当在 2012 年,它们采用 1 太比特部件构建时,该设备将具有 2 TB 的容量,并且确实能够存储 TPC-C 数据库。我们可以用几个(例如,10 个)400 美元的闪存盘(可能)替换 44,000 美元的磁盘阵列。
三星 NSSD 的系统图表明有很多创新机会:用于容错的有趣 RAID 选项(将《高性能闪存盘设计》7 中的想法与非易失性存储映射和块缓冲区相结合,并在芯片阵列上写入 RAID-5 数据条带),添加电池,添加用于写入时复制快照的逻辑等等。这些设备为文件系统带来了全新的方法。它们是磁盘和 RAM 之间潜在的差距填补者,并且它们本身就是有趣的“热数据”存储设备。
在这个新世界中,磁盘提供高容量、廉价的存储和带宽——冷存储和存档。闪存盘为热数据和温数据提供非易失性存储。闪存也可以在磁盘驱动器内部用于缓冲写入和提供安全的写入缓存。在这个新世界中,磁盘看起来更像磁带,而闪存盘则填补了传统上由磁盘填充的直接访问块存储角色。闪存是更好的磁盘(更高的 IOPS,延迟降低 10 倍),而磁盘是更好的磁带(无需倒带,挂载时间以毫秒为单位)。闪存每千兆字节的成本远低于五年前的磁盘价格,而当考虑总系统成本(读取器、软件和操作)时,磁盘每千兆字节的成本远优于磁带。因此,这些变化非常受欢迎。
本文的准备工作得到了 Aaron Dietrich、Dennis Fetterly、James Hamilton 和 Chuck Thacker 的帮助。
最初发表于 Queue 第 6 卷,第 4 期——
在 数字图书馆 中评论本文
Pat Helland - 关注你的状态,为了你的心境
随着应用程序进入分布式和可扩展的世界,它们经历了有趣的演变。同样,存储及其近亲数据库也与应用程序并肩发展。很多时候,存储和应用程序的语义、性能和故障模型都在微妙地变化,以支持不断变化的业务需求和环境挑战。规模的扩大确实搅乱了局面。本文探讨了其中一些问题及其对系统的影响。
Alex Petrov - 现代存储系统背后的算法
本文仔细研究了现代数据库中常用的两种存储系统设计方法(读优化的 B 树和写优化的 LSM(日志结构合并)树),并描述了它们的使用案例和权衡。
Mihir Nanavati, Malte Schwarzkopf, Jake Wires, Andrew Warfield - 非易失性存储
在大多数执业计算机科学家的整个职业生涯中,一个基本观察结果始终成立:CPU 的性能明显高于 I/O 设备,并且价格也更高。CPU 能够以极高的速率处理数据,同时为多个 I/O 设备提供服务,这一事实对各种规模系统的硬件和软件设计产生了深远的影响,几乎在我们构建它们的整个历史中都是如此。
Thanumalayan Sankaranarayana Pillai, Vijay Chidambaram, Ramnatthan Alagappan, Samer Al-Kiswany, Andrea C. Arpaci-Dusseau, Remzi H. Arpaci-Dusseau - 崩溃一致性
数据的读取和写入是任何冯·诺依曼计算机最基本的方面之一,但它却出奇地微妙且充满细微差别。例如,考虑在具有多个处理器的系统中访问共享内存。虽然程序员最容易理解的简单直观的方法是强一致性,但许多较弱的模型也得到了广泛应用(例如,x86 总存储排序);这些方法提高了系统性能,但代价是使关于系统行为的推理更加复杂且容易出错。