闪存数据,第一部分:磁盘存储的演变和 NVMe 简介

NVMe 驱动器为实现高速计算铺平了道路,但这项技术并非一蹴而就。正是通过一个渐进的演变过程,我们现在才得以依赖高性能的 SSD 作为我们的主要存储层。

固态硬盘 (SSD) 近年来在计算机行业掀起了一场风暴。这项技术以其高速性能令人印象深刻。它承诺以低延迟访问有时至关重要的数据,同时提高整体性能,至少与现在正逐渐成为传统技术的硬盘驱动器 (HDD) 相比是这样。随着每年的推移,SSD 的市场份额持续攀升,在许多领域取代了 HDD。这种影响在个人、移动和服务器计算中都可见一斑。

IBM 于 1956 年首次将 HDD 引入计算机世界。到 20 世纪 60 年代,HDD 成为通用计算机的主要辅助存储设备(重点是辅助存储设备,内存是第一位)。容量和性能是定义 HDD 的主要特征。在许多方面,这些特征仍然在定义这项技术——尽管方式并不总是积极的(稍后会详细介绍)。

第一款 IBM 制造的硬盘驱动器,350 RAMAC,体积有两个中型冰箱那么大,在 50 张磁盘的堆叠上总容量为 3.75MB。现代 HDD 技术已经生产出容量高达 16TB 的磁盘驱动器,特别是采用了最新的叠瓦式磁记录 (SMR) 技术和氦气——是的,就是元素周期表中缩写为 He 的同一种化学元素。密封的氦气增加了驱动器的潜在速度,同时减少了阻力和湍流。由于密度低于空气,它还允许在 2.5 英寸和 3.5 英寸传统磁盘驱动器使用的相同空间中堆叠更多的盘片。

""

图 1. 标准 HDD 在其历史和所有外形尺寸中的阵容(作者:Paul R. Potts—由作者提供,CC BY-SA 3.0 us,https://commons.wikimedia.org/w/index.php?curid=4676174

磁盘驱动器的性能通常通过以下方式计算:将驱动器磁头移动到特定磁道或柱面所需的时间,以及请求的扇区移动到磁头下方所需的时间——即延迟。性能也以数据传输速率来衡量。

由于是机械设备,HDD 的性能远不如内存快。许多移动部件增加了延迟时间,并降低了访问数据(无论是读取还是写入操作)的整体速度。

""

图 2. 磁盘盘片布局

每个 HDD 内部都有磁性盘片,通常被称为磁盘。这些盘片是存储信息的地方。通过主轴绑定并同步旋转,一个 HDD 将有多个盘片彼此叠放,中间留有最小的间隙。

类似于唱片的工作方式,盘片是双面的,每个盘片的表面都有称为磁道的圆形刻槽。每个磁道由扇区组成。随着您越来越靠近盘片的边缘,每个磁道上的扇区数量会增加。如今,您会发现扇区的物理大小要么是 512 字节,要么是 4 千字节(4096 字节)。在编程领域,一个扇区通常等同于一个磁盘块。

磁盘旋转的速度会影响信息的读取速率。这被定义为磁盘的旋转速率,以每分钟转数 (RPM) 为单位进行测量。这就是为什么您会发现现代驱动器以 7200 RPM(或每秒 120 转)等速度运行。较旧的驱动器旋转速度较慢。高端驱动器可能会以更高的速度旋转。这种限制造成了瓶颈。

驱动臂位于盘片的上方或下方。它在其表面上伸展和缩回。臂的末端是读写头。它以微观距离位于盘片表面上方。当磁盘旋转时,磁头可以访问当前磁道上的信息(无需移动)。但是,如果磁头需要移动到下一个磁道或完全不同的磁道,则读取或写入数据的时间会增加。从程序员的角度来看,这被称为磁盘寻道,这为该技术造成了第二个瓶颈。

现在,虽然 HDD 的性能随着更新的磁盘访问协议(如串行 ATA (SATA) 和串行连接 SCSI (SAS))和技术而不断提高,但它仍然是 CPU 以及整个计算机系统的瓶颈。每种磁盘协议都有其自身的最大吞吐量硬性限制(兆字节或千兆字节每秒)。数据传输方式也非常串行化。这对于旋转磁盘来说效果很好,但对于闪存技术来说,它不能很好地扩展。

自 HDD 诞生以来,工程师们一直在设计更新颖、更具创意的方法来帮助加速 HDD 的性能(例如,通过内存缓存),在某些情况下,他们已经用 SSD 等技术完全取代了 HDD。如今,SSD 似乎已部署在各处。每千兆字节的成本正在下降,闪存和传统旋转磁盘之间的价格差距正在缩小。但是,我们最初是如何走到这一步的呢?SSD 并非一夜成名。它的历史更像是一个渐进的过程,可以追溯到最早的计算机被开发出来的时候。

计算机内存简史

内存有多种形式,但在非易失性存储器 (NVM) 出现之前,计算世界首先接触到的是易失性存储器,即随机存取存储器 (RAM)。RAM 引入了在相同时间内从存储介质的任何位置写入/读取数据的能力。特定数据集的物理位置通常是随机的,但这并不影响操作完成的速度。通过缓存经常读取的数据或暂存需要写入的数据,这种类型内存的使用掩盖了从速度呈指数级下降的 HDD 访问数据的痛苦。

RAM 技术中最值得注意的是动态随机存取存储器 (DRAM)。它也于 1966 年在 IBM 实验室问世,比 HDD 晚十年。由于 DRAM 更靠近 CPU,而且无需处理机械组件(即 HDD),因此 DRAM 的性能非常出色。即使在今天,许多数据存储技术仍致力于达到 DRAM 的速度。但是,正如我上面强调的那样,DRAM 存在一个缺点:该技术是易失性的,一旦电容器驱动的集成电路 (IC) 断电,数据就会随之消失。

DRAM 技术的另一组缺点是其容量非常低以及每千兆字节的价格昂贵。即使按照今天的标准,与速度较慢的 HDD 和 SSD 相比,DRAM 也太贵了。

在 DRAM 首次亮相后不久,就出现了可擦除可编程只读存储器 (EPROM)。它由英特尔发明,大约在 1971 年问世。与易失性存储器不同,EPROM 提供了一个行业内极具吸引力的变革:一旦系统电源关闭,内存就能保留其数据。EPROM 在其 IC 中使用晶体管而不是电容器。这些晶体管即使在断电后也能够保持状态。

顾名思义,EPROM 属于只读存储器 (ROM) 的范畴。数据通常使用特殊设备或工具预先编程到这些芯片中,在生产中,它只有一个目的:以高速读取。由于这种设计,EPROM 立即在嵌入式和 BIOS 应用程序中流行起来,后者存储特定于供应商的详细信息和配置。

更靠近 CPU

随着时间的推移,一个事实变得越来越明显:数据(存储)越靠近 CPU,您就能够越快地访问(和操作)它。最靠近 CPU 的内存是处理器的寄存器。处理器可用的寄存器数量因架构而异。寄存器的目的是保存少量用于快速存储的数据。毫无疑问,这些寄存器是访问少量数据最快的方式。

紧随 CPU 寄存器之后的是 CPU 缓存。这是一种内置于处理器模块的硬件缓存,CPU 利用它来减少从主内存 (DRAM) 访问数据所需的成本和时间。它围绕静态随机存取存储器 (SRAM) 技术设计,SRAM 也是一种易失性存储器。与典型的缓存一样,CPU 缓存的目的是存储来自最常用的主内存位置的数据副本。在现代 CPU 架构上,存在多个不同的独立缓存(其中一些缓存甚至被拆分)。它们按缓存级别层次结构组织:1 级 (L1)、2 级 (L2)、3 级 (L3) 等等。处理器越大,缓存级别越多,级别越高,它可以存储的内存就越多(即从 KB 到 MB)。缺点是,级别越高,其位置离主 CPU 就越远。虽然现代应用程序大多无法察觉到,但它确实会引入延迟。

""

图 3. CPU 及其内存位置/缓存的总体轮廓

首次记录在处理器中构建数据缓存的使用可以追溯到 1969 年和 IBM System/360 Model 85 大型计算机系统。直到 20 世纪 80 年代,更主流的微处理器才开始集成自己的 CPU 缓存。部分延迟是受成本驱动的。就像今天一样,(所有类型的)RAM 都非常昂贵。

因此,数据访问模型是这样的:离 CPU 越远,延迟越高。DRAM 比 HDD 更靠近 CPU,但不如寄存器或 IC 中设计的缓存级别那么近。

""

图 4. 数据访问的高级模型

固态硬盘

给定存储技术的性能不断被衡量,并与 CPU 内存的速度进行比较。因此,当第一批商用 SSD 进入市场时,公司和个人很快就采用了这项技术。即使价格高于 HDD,人们也能够证明这笔开销是合理的。时间就是金钱,如果访问驱动器可以节省时间,那么它可能会增加利润。然而,遗憾的是,随着第一批基于 NAND 的商用 SSD 的推出,驱动器并没有使数据存储更靠近 CPU。这是因为早期的供应商选择采用现有的磁盘接口协议,例如 SATA 和 SAS。这个决定确实鼓励了消费者的采用,但再次限制了整体吞吐量。

""

图 5. 2.5 英寸外形尺寸的 SATA SSD

即使 SSD 没有更靠近 CPU,它也在这项技术中实现了一个新的里程碑——它减少了跨存储介质的寻道时间,从而显著降低了延迟。这是因为驱动器是围绕 IC 设计的,并且不包含任何可移动组件。与传统的 HDD 相比,整体性能有了天壤之别。

第一个正式生产的无需电源(即电池)来维持状态的 SSD 于 1995 年由 M-Systems 推出。它们旨在取代关键任务型军事和航空航天应用中的 HDD。到 1999 年,基于闪存的技术被设计出来,并以传统的 3.5 英寸存储驱动器外形尺寸提供,并且一直以这种方式发展到 2007 年,当时一家新成立的革命性初创公司 Fusion-io(现在是西部数据的一部分)决定改变传统存储驱动器的性能限制性外形尺寸,并将该技术直接放到 PCI Express (PCIe) 总线上。这种方法消除了许多不必要的通信协议和子系统。该设计也更靠近 CPU 一点,并产生了明显的性能提升。这种新设计不仅改变了未来多年的技术,而且甚至将 SSD 带入了传统数据中心。

Fusion-io 的产品后来启发了其他内存和存储公司将一些类似的技术引入双列直插式内存模块 (DIMM) 外形尺寸,该尺寸直接插入到受支持主板的传统 RAM 插槽中。这些类型的模块在 CPU 中注册为不同类型的内存,并保持在某种受保护模式下。换句话说:除非通过专门设计的设备驱动程序或应用程序接口完成,否则主系统以及操作系统不会触及这些内存设备。

这里还值得注意的是,基于晶体管的 NAND 闪存技术在性能上仍然无法与 DRAM 相提并论。我指的是微秒级的延迟与 DRAM 的纳秒级延迟。即使采用 DIMM 外形尺寸,基于 NAND 的模块的性能也不如 DRAM 模块。

介绍 NAND 内存

是什么让 SSD 比传统 HDD 更快?简单的答案是,它是用芯片构建的内存,没有移动组件。“固态”这项技术的名称就概括了这一特点。但是,如果您想要更详细的答案,请继续阅读。

SSD 不是将数据保存到旋转磁盘上,而是将相同的数据保存到 NAND 闪存池中。NAND(或非与)技术由浮栅晶体管组成,与 DRAM 中使用的晶体管设计(必须每秒刷新多次)不同,NAND 即使在设备未供电的情况下也能够保持其充电状态——因此该技术具有非易失性。

在更低的层面上,在 NAND 配置中,电子存储在浮栅中。与您读取布尔逻辑的方式相反,电荷表示为“0”,无电荷表示为“1”。这些位存储在一个单元中。它以网格布局组织,称为块。网格的每一行称为页,页大小通常设置为 4K(或更大)。传统上,每个块有 128-256 页,块大小高达 1MB 或更大。

""

图 6. NAND 芯片布局

NAND 有不同的类型,所有类型都由每个单元的位数定义。顾名思义,单层单元 (SLC) 存储一位。多层单元存储两位。三层单元存储三位。而且,新出现的是 QLC。猜猜它可以存储多少位?你猜对了:四位。

现在,虽然 TLC 比 SLC NAND 提供更高的存储密度,但它是有代价的:延迟增加——也就是说,读取速度大约慢四倍,写入速度慢六倍。原因在于数据如何在 NAND 单元中进出。在 SLC NAND 中,设备的控制器只需要知道该位是 0 还是 1。对于 MLC,单元可以容纳更多值——确切地说是四个:00、01、10 或 11。在 TLC NAND 中,它可以容纳八个值:000、001、010、011、100、101、110、111。这带来了大量的开销和额外的处理。无论如何,无论您的驱动器使用 SLC 还是 TLC NAND,它的性能仍然比 HDD 快得多——细节而已。

关于 NAND 还有很多要分享的内容,例如读取、写入和擦除(可编程擦除或 PE 周期)的工作原理,其中最后一个确实最终会影响写入性能以及该技术早期的一些缺陷,但我不会用这些来让您感到厌烦。请记住:对芯片进行电荷操作比在磁盘盘片上移动磁头要快得多。现在是时候介绍 NVMe 了。

枯燥的细节

好吧,我撒谎了。写入性能在 SSD 的整个生命周期中可能会有所不同。当 SSD 是新的时,其所有数据块都被擦除并呈现为新的。传入数据直接写入 NAND。一旦 SSD 填满了设备上的所有可用数据块,它就必须擦除先前编程的块才能写入新数据。在行业中,这一刻被称为设备的写入悬崖。要释放旧块,必须擦除选定的块。此操作称为可编程擦除 (PE) 周期,它会增加设备的写入延迟。只要时间足够长,您就会注意到,使用过的 SSD 最终的性能不如全新的 SSD。NAND 单元被编程为处理有限数量的擦除。

为了克服所有这些限制和最终的瓶颈,供应商会采用各种技巧,包括以下内容:

  • NAND 的过度配置:虽然设备可能注册了 3TB 的存储空间,但实际上它可能配备了 6TB。
  • 写入数据合并,以减少写入放大的影响。
  • 磨损均衡:减少对 NAND 的相同区域进行写入和重写的需求。
非易失性存储器标准 (NVMe)

Fusion-io 构建了一个封闭且专有的产品。仅这一事实就促使许多行业领导者齐聚一堂,制定一项新标准,以与先驱者竞争,并将更多 PCIe 连接的闪存推向数据中心。随着第一个 行业规范 于 2011 年发布,NVMe 迅速崛起为 SSD 技术的先锋。请记住,从历史上看,SSD 是构建在 SATA 和 SAS 总线之上的。这些接口对于成熟的闪存技术来说运行良好,但由于所有协议开销和总线速度限制,这些驱动器很快就经历了自身相当多的性能瓶颈(和限制)。如今,现代 SAS 驱动器的运行速度为 12Gbit/s,而现代 SATA 驱动器的运行速度为 6Gbit/s。这就是该技术将其重点转移到 PCIe 的原因。由于总线更靠近 CPU,并且 PCIe 能够以越来越快的速度运行,因此 SSD 似乎非常适合。使用 PCIe 3.0,现代驱动器可以达到高达 40Gbit/s 的速度。对 NVMe 驱动器的支持已集成到 Linux 3.3 主线内核(2012 年)。

""

图 7. PCIe NVMe SSD(作者:Dsimic - Own work,CC BY-SA 4.0,https://commons.wikimedia.org/w/index.php?curid=41576100

NVMe 真正超越操作系统传统存储堆栈的原因在于其更简单、更快速的排队机制。这些机制被称为提交队列 (SQ) 和完成队列 (CQ)。每个队列都是固定大小的循环缓冲区,操作系统使用它向 NVMe 控制器提交一个或多个命令。这些队列中的一个或多个还可以固定到特定的内核,从而实现更不间断的操作。告别串行通信。驱动器 I/O 现在是并行化的。

基于 Fabric 的非易失性存储器标准 (NVMeoF)

在 SAS 或 SATA 的世界中,存在存储区域网络 (SAN)。SAN 是围绕 SCSI 标准设计的。SAN(或任何其他存储网络)的主要目标是提供对网络中单个或多个操作系统主机的一个或多个存储卷通过一个或多个路径的访问。如今,最常用的 SAN 是基于 iSCSI 的,iSCSI 是基于 TCP/IP 的 SCSI。从技术上讲,NVMe 驱动器可以在 SAN 环境中配置,尽管协议开销会引入延迟,使其成为不太理想的实现方式。2014 年,NVMe Express 委员会准备通过 NVMeoF 标准来纠正这一问题。

NVMeoF 背后的目标很简单:启用 NVMe 传输桥接器(它围绕 NVMe 排队架构构建),并避免除受支持的 NVMe 命令(端到端)之外的任何和所有协议转换开销。通过这种设计,网络延迟显着降低(小于 200 纳秒)。这种设计依赖于 PCIe 交换机的使用。第二种设计正在兴起,它基于使用远程直接内存访问 (RDMA) 的现有以太网 Fabric。

""

图 8. NVMe Fabric 与其他存储网络的比较

4.8 Linux 内核引入了许多新代码来支持 NVMeoF。这些补丁是由英特尔、三星和其他地方的辛勤工作的开发人员共同努力提交的。三个主要组件被修补到内核中,包括通用的 NVMe 目标支持框架。此框架允许使用 NVMe 协议从 Linux 内核导出块设备。依赖于此框架,现在支持 NVMe 回环设备以及基于 Fabric 的 NVMe RDMA 目标。如果您还记得,最后一部分是两种更常见的 NVMeoF 部署之一。

结论

好了,这就是对闪存存储的介绍和深入探讨。现在您应该明白为什么这项技术越来越受欢迎,并且是高速计算的首选。本文的第二部分将重点转移到在 Linux 环境中使用 NVMe 驱动器以及通过 NVMeoF 网络访问这些相同的 NVMe 驱动器。

进一步阅读

Petros Koutoupis,LJ 特约编辑,目前是 Cray 公司 Lustre 高性能文件系统部门的高级性能软件工程师。他还是 RapidDisk 项目的创建者和维护者。Petros 在数据存储行业工作了十多年,并帮助开创了当今广泛应用的许多技术。

加载 Disqus 评论