https://www.linuxjournal.com/content/data-flash-part-i-evolution-disk-storage-and-introduction-nvme

NVMe(非易失性内存Express,或称非易失性内存主机控制器接口规范)是一种用于访问高速存储介质的新协议,该协议是相对较新的,功能丰富的协议,它是专为通过PCIe接口直接连接到CPU的非易失性存储介质(NAND和持久性存储器)而设计的。该协议建立在高速PCIe通道上。PCIe Gen 3.0链接可提供的传输速度是SATA接口的两倍以上。 NVMe协议利用到底层介质的并行,低延迟数据路径,类似于高性能处理器体系结构。与传统的SAS和SATA协议相比,这提供了显着更高的性能和更低的延迟。

NVMe驱动器技术并不是突然出现的。通过不断发展,我们现在将性能卓越的SSD用作主要存储层。 近年来,固态硬盘(SSD)的市场份额持续攀升,取代了许多行业的HDD。 IBM于1956年首次亮相HDD。到1960年代,HDD成为通用计算机中占主导地位的辅助存储设备。容量和性能是定义HDD的主要特征。 IBM制造的第一个硬盘驱动器350 RAMAC与两个中型冰箱一样大,在50个磁盘的堆栈上总容量为3.75MB。现代HDD技术已生产出容量高达16TB的磁盘驱动器,特别是结合了SMR技术和氦气。密封的氦气增加了驱动器的潜在速度,同时减少了阻力和湍流。由于密度不如空气,因此还可以在2.5英寸和3.5英寸常规磁盘驱动器使用的相同空间中堆叠更多的磁盘。 磁盘驱动器的性能通常由将驱动器磁头移动到特定磁道或圆柱体所需的时间以及请求的扇区在磁头下移动所需的时间(即延迟)来计算。还以传输数据的速率来衡量性能。

作为机械设备,HDD的不如内存快。许多移动组件增加了等待时间,并降低了访问数据的整体速度(用于读取和写入操作)。 每个HDD的内部都有磁性磁盘,通常称为磁盘。这些拼盘是存储信息的地方。HDD由一根主轴绑定并一致地旋转,一个HDD将有一个以上的盘片并排放置,它们之间的空间最小。

与留声机唱片的工作原理类似,唱片是双面的,每个唱片的表面都有圆形的蚀刻,称为轨道。每个轨道由扇区组成。随着靠近盘片边缘,每个轨道上的扇区数都会增加。如今,您会发现一个扇区的物理大小为512字节或4千字节(4096字节)。在编程中,扇区通常等同于磁盘块。

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

执行器臂位于盘片上方或下方。它在其表面上延伸和缩回。手臂末端是一个读写头。它位于盘子表面上方的微观距离处。随着磁盘旋转,磁头可以访问当前磁道上的信息(不移动)。但是,如果磁头需要移动到下一个轨道或完全不同的轨道,则会增加读取或写入数据的时间。从程序员的角度来看,这称为磁盘搜索,这造成了第二个瓶颈。 现在,尽管通过更新的磁盘访问协议(例如串行ATA(SATA)和串行连接的SCSI(SAS))和技术,HDD的性能一直在提高,但它仍然是CPU以及整个计算机系统的瓶颈。每个磁盘协议对最大吞吐量(每秒兆字节或千兆字节)都有自己的硬性限制。数据传输的方法也非常串行化。这在旋转的磁盘上很好用,但不能很好地扩展到Flash技术。

计算机内存简史

内存有多种形式,但是在非易失性内存(NVM)出现之前,计算世界首先以随机存取内存(RAM)的形式引入易失性内存。RAM引入了在相同的时间内向/从存储介质的任何位置写入/读取数据的功能。特定数据集通常是随机的物理位置,并不影响操作完成的速度。通过缓存经常读取的数据或暂存需要写入的数据,这种类型的内存的使用掩盖了从指数级较慢的HDD访问数据的痛苦。 RAM技术中最著名的是动态随机存取存储器(DRAM)。硬盘驱动器十年后的1966年,它也从IBM实验室出来。DRAM与CPU距离更近,并且也不必处理机械组件(即HDD),因此其运行速度非常快。即使在今天,许多数据存储技术都在努力以DRAM的速度运行。但是这有一个缺点:一旦电容器驱动的集成电路(IC)断电,数据就会随之消失。

DRAM技术的另一缺点是其容量非常低,每GB的价格也很高。即使按照今天的标准,与较慢的HDD和SSD相比,DRAM还是太昂贵了。

DRAM首次亮相后不久,便出现了可擦可编程只读存储器(EPROM)。它是由英特尔发明的,于1971年左右问世。与易失性同类产品不同,EPROM内存在系统电源关闭后立即保留其数据。EPROM在其IC中使用晶体管代替电容器。这些晶体管即使在断电后也能够保持状态。 顾名思义,EPROM属于其自己的只读存储器(ROM)类。通常,数据是使用特殊的设备或工具预先编程到这些芯片中的,而在生产时,它的目的是唯一的:从高速读取数据。这种设计的结果是,EPROM立即在嵌入式和BIOS应用程序中变得很流行,后者则存储了特定于供应商的详细信息和配置。

靠近CPU

显而易见,将数据(存储)移到CPU越近,访问(和操作)数据的速度就越快。最接近CPU的内存是处理器的寄存器。处理器可用的寄存器数量因体系结构而异。该寄存器的目的是保存少量打算用于快速存储的数据。毫无疑问,这些寄存器是访问小尺寸数据的最快方法。

接下来,紧随CPU的寄存器的是CPU缓存。这是内置在处理器模块中的硬件高速缓存,CPU可以利用它来减少从主存储器(DRAM)访问数据的成本和时间。它是围绕静态随机存取存储器(SRAM)技术设计的,该技术也是一种易失性存储器。像典型的高速缓存一样,此CPU高速缓存的目的是存储来自最频繁使用的主内存位置的数据副本。在现代CPU架构上,存在多个不同的独立缓存(并且其中一些缓存甚至被拆分了)。它们按照缓存级别的层次结构进行组织:级别1(L1),级别2(L2),级别3(L3),依此类推。处理器越大,缓存级别越多,级别越高,它可以存储的内存就越多(即从KB到MB),其位置离主CPU越远,但它也确实引入了延迟。

首次使用处理器中的高速缓存的记录可以追溯到1969年,然后是IBM System/360 Model 85大型机。直到1980年代,更主流的微处理器才开始合并自己的CPU缓存。部分原因是成本。就像今天一样,(所有类型的)RAM非常昂贵。 因此,数据访问模型是这样的:离CPU越远,延迟就越大。DRAM的位置比HDD位置更靠近CPU,但不及IC中设计的寄存器或高速缓存级别那么近。

固态硬盘

当第一批商用SSD进入市场时,公司和个人都很快就采用了该技术。即使价格更高,与HDD相比,人们还是能够证明其合理性。时间就是金钱,如果访问驱动器可以节省时间,则可能会增加利润。但不幸的是,随着第一个基于NAND的商业化SSD的推出,该驱动器并没有将数据存储移到更靠近CPU的地方。这是因为早期的供应商选择采用现有的磁盘接口协议,例如SATA和SAS。该决定的确鼓励了消费者的采用,但同样它限制了整体吞吐量。 尽管SSD并没有靠近CPU,但它的确实现了该技术的新里程碑-减少了跨存储介质的寻道时间,从而大大减少了延迟。这是因为驱动器是围绕IC设计的,并且不包含可移动组件。 M-Systems于1995年推出了第一款无需电源(即电池)即可维持状态的正式SSD。它们旨在替代军事和航空航天应用关键任务中的HDD。到1999年,以传统的3.5英寸存储驱动器外形设计并提供了基于闪存的技术,并且一直以这种方式进行开发,直到2007年新成立的革命性初创公司Fusion-io(现已成为Western Digital的一部分)决定改变传统存储驱动器的性能极限形式,并将该技术直接应用于PCI Express(PCIe)总线,这种方法消除了许多不必要的通信协议和子系统,设计也离CPU越来越近,并产生了明显的性能改进。

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

在这里还值得注意的是,与DRAM性能相比,基于晶体管的NAND闪存技术仍然显得苍白。我说的是微秒延迟与DRAM的纳秒延迟。即使采用DIMM尺寸,基于NAND的模块的性能也不如DRAM模块好。

NAND存储器简介

是什么让SSD比传统的HDD更快?简单的答案是,它是由芯片构建的,没有移动组件。固态技术就是这种特性的标志。

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

非易失性内存Express(NVMe)

Fusion-io构建了封闭的专有产品。仅这一事实就吸引了许多行业领导者共同定义新标准,以与先驱竞争,并将更多的PCIe连接的闪存推入数据中心。拥有行业第一规范NVMe在2011年宣布推出后,迅速上升到SSD技术的最前沿。请记住,从历史上看,SSD是基于SATA和SAS总线构建的。这些接口对于成熟的闪存技术工作得很好,但是在所有协议开销和总线速度限制的情况下,这些驱动器很快就经历自己的合理性能瓶颈(和限制)。如今,现代SAS驱动器以12Gbit / s的速度运行,而现代SATA驱动器以6Gbit / s的速度运行。这就是为什么该技术将重点转移到PCIe的原因。随着总线距离CPU越来越近,PCIe能够以越来越高的速度运行,SSD似乎正好适合。使用PCIe 3.0,现代驱动器可以达到40Gbit / s的速度。对NVMe驱动器的支持已集成到Linux 3.3主线内核(2012年)中。 NVMe真正使操作系统的旧式存储堆栈大放异彩的原因在于其更简单,更快速的排队机制。这些称为提交队列(SQ)和完成队列(CQ)。每个队列都是固定大小的循环缓冲区,操作系统使用该缓冲区将一个或多个命令提交给NVMe控制器。这些队列中的一个或多个也可以固定到特定的内核,这样可以进行更多不间断的操作。再见串行通讯。现在驱动器I/O已并行化。

NVMeoF

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

NVMeoF的目标很简单:启用围绕NVMe排队体系结构构建的NVMe传输桥,并避免支持的NVMe命令(端到端)以外的任何协议转换开销。通过这种设计,网络等待时间会明显下降(小于200ns)。此设计依赖于PCIe交换机的使用。基于使用远程直接内存访问(RDMA)的现有以太网结构的第二种设计正在取得进展。 Linux内核引入了许多支持NVMeoF的新代码。这些补丁是英特尔,三星和其他地方的辛勤工作的开发人员共同努力的一部分。内核中修补了三个主要组件,包括常规的NVMe Target Support框架。该框架使模块设备可以使用NVMe协议从Linux内核中导出。依赖于此框架,现在支持NVMe环回设备以及基于Fabrics RDMA目标的NVMe。如果您还记得的话,这最后一部分是另外两个常见的NVMeoF部署之一。