SSD学习笔记-NOR, NAND, FTL, GC基本概念
NOR v.s. NAND
两者都是非易失存储介质。即掉电都不会丢失内容, 在写入前都需要擦除。
NOR有点像内存,支持随机访问,这使它也具有支持XIP(eXecute In Place)的特性,可以像普通ROM一样执行程序。现在几乎所有的BIOS和一些机顶盒上都是使用NOR Flash,它的大小一般在1MB到32MB之间,价格昂贵。
NAND Flash广泛应用在各种存储卡,U盘,SSD,eMMC等等大容量设备中。
NOR VS NAND - 场景
如果以镁光(Micron)自己的NAND和NOR对比的话,详细速度数据如下:
NOR VS NAND - 性能
NAND Flash
NAND Flash目前的用途更为广泛,它的颗粒根据每个存储单元内存储比特个数的不同,可以分为 SLC(Single-Level Cell)、MLC(Multi-Level Cell) 和 TLC(Triple-Level Cell) 三类。其中,在一个存储单元中,SLC 可以存储 1 个比特,MLC 可以存储 2 个比特,TLC 则可以存储 3 个比特。NAND Flash 的单个存储单元存储的比特位越多,读写性能会越差,寿命也越短,但是成本会更低。现在高端SSD会选取MLC甚至SLC,低端SSD则选取TLC。SD卡一般选取TLC。
SLC,MLC,TLC
NAND Flash的组成
一个典型的Flash芯片由Package, Die, Plane, Block和Page组成,其中die内部可以通过3D 堆叠技术扩展容量,譬如三星的V-NAND每层容量都有128Gb(16GB),通过3D堆叠技术可以实现最多24层堆叠,这意味着24层堆叠的总容量将达到384GB!
NAND Flash组成
写放大
Block是擦除操作的最小单位,Page是写入动作的最小单位,一个Block包含若干个Pages。当我们有了块干净的Flash,我们第一个想干的事就是写些东西上去,无论我们是写一个byte还是很多东西,必须以page为单位,即写一个byte上去也要写一个page。要修改一个字节,必须要擦除,擦除的最小单元是Block。
Flash Translation Layer (FTL)
NAND flash的寿命是由其擦写次数决定的(P/E数 (Program/Erase Count)来衡量的),频繁的擦除慢慢的会产生坏块。那么我们如何才能平衡整块Flash的整体擦写次数呢?这就要我们的FTL登场了。
Flash Translation Layer原理
FTL简单来说就是系统维护了一个逻辑Block地址(LBA,logical block addresses )和物理Block地址(PBA, physical block addresses)的对应关系。 有了这层映射关系,我们需要修改时就不需要改动原来的物理块,只需要标记原块为废块,同时找一个没用的新物理块对应到原来的逻辑块上就好了。
垃圾回收(GC,Garbage Collection)机制定期回收这些废块, 和Java,GO等语言的GC机制类似,应用不需要像C/C++那样关注内存释放,GC定期扫描,回收释放内存。目标是让Flash最小化擦除次数,最大化使用寿命。
NVMe技术架构深度分析
NVM(Non-Volatile Memory)翻译过来为非易失存储器,是一类存储器的一般术语总称。而NVMe(Non-Volatile Memory Express)是一个可扩展的主控器芯片接口标准,主要为企业、数据中心以及客户端系统中应用PCIe接口的固态存储设备(SSD)设计,它的目标是最大限度的释放闪存的潜能。
NVMe接口属于逻辑设备接口,工作在支持NVMe的板卡上的主控器和主机端的对等层内,它规定了操作系统与NVM子系统之间的通信协议,定义了一套指令集和功能集。NVMe为基于PCIe的SSD带来了较低的时延,较高的IOPS和较低能耗的优势。
首先通过下图展示下NVMe在数据传输过程中的位置,有一部分位于PCIe之上,这部分也是NVMe驱动的主要部分,还有一部分位于用户态的软件层,用于应用层与NVMe驱动间的交互。
NVMe有以下几个关键属性:
在命令提交(Command Submission)或者完成(Completion)的路径上不需要读取相关寄存器(不可缓存或MMIO寄存器);支持最多可达64K 的I/O 队列,每个队列支持64K的未处理命令命令;每个队列的的优先级拥有明确的仲裁机制;为确保超高效的IO操作,完成一个4KB读取请求需要的所有信息包含在64B的命令中;高效且流线型的指令集;支持MSI/MSI-X中断和中断聚合;支持多个命名空间;有效支持IO虚拟化架构,如SR-IOV;健全的错误报告和管理功能;支持多路径IO和命名空间共享;支持许多企业需求,如端到端的数据保护(与SCSI保护信息兼容)。
NVMe有很多关键概念,其中命名空间(Name Space简称NS),是一定量的NVM(Non-Volatile Memory)集合,这些NVM可被格式化为许多个逻辑块。一个NVMe控制器能支持多个由不同命名空间ID(简称NSID)标识的NS。
在系统向某个NS提交IO命令之前,这个NS必须与某个控制器关联。若NVM子系统支持NS管理,则NVM子系统内的NSID必须是唯一的(不管NS连接的是哪个控制器);若不支持,则不要求私有NS的ID唯一。NVM子系统包括N个控制器,M个命名空间,S个PCIe端口,一个NVM介质以及一个接口连接控制器与该介质。
NVMe是基于成对的Submission Queue(简称SQ)和Completion Queue(简称CQ)机制工作,它们存在于主机内存里。Submission Queue由系统放置命令,Completion Queue由控制器放置完成信息。
Admin Submission Queue和对应的Admin Completion Queue用来管理和控制主控器(如创建和删除IO队列,终止命令等),只有属于AdminCommand Set的命令才会被提交到AdminSubmission Queue。Admin Queue的ID都是0。
IO Submission Queues和对应的IOCompletion Queues用来处理IO命令,规范定义了一种IO Command Set,叫做NVM Command Set,与IO队列一起使用。系统在创建Submission Queue前必须先创建相关的Completion Queue,删除操作也要先于相关的Completion Queue。
下面两张图展示了主机、主控器与队列之间的配合关系。由系统创建队列,队列最大数目可到主控器支持的上限。通常情况下是根据主机的配置和预期的工作负载来创建,并将一对队列绑定到一个CPU核上,避免使用锁与更多的核间数据传递。从下面两张图中可以看出Admin永远是1对1的,而IO队列可以是多个SQ对应一个CQ。
每个SQ都是一个有着固定“槽位”大小的循环缓冲区,系统用它来提交命令来等待控制器执行。当系统提交了一批新的等待执行的命令时,系统将更新SQ尾部Doorbell寄存器通知主控器,这时主控器将重写主控器内部对应SQ尾部的值。主控器从SQ中顺序取出64字节的命令,但之后对命令的执行可能是任何顺序。
内存中将分配PRP(Physical Region Page)条目或Scatter Gather Lists(SGL)用于数据传输,每个命令包括两个PRP条目或一个SGL部分。如果需要更多的PRP条目则需要提供一个指向PRP链表的指针,而对于SGL则在SGL部分提供一个指向下一个SGL部分的指针。
每个CQ也都是一个有着固定“槽位”大小的循环缓冲区,控制器用它来投递已完成命令的状态信息。一个已完成的命令由相关的SQ ID和CQ ID唯一标识,SQ和CQ的ID由系统分配。系统在处理好CQ条目后会释放该CQ条目并更新CQ的头指针。
在CQ条目中,有一Bit(Phase简称P)是用来表示该条目是否是刚刚投递来的,这样做可以帮助系统决定该新条目是前一轮还是当前一轮的完成通知。每次处理CQ时,遍历完所有CQE条目后,控制器都会将Phase值取反。
多路径IO指的是一个主机和一个命名空间之间存在多条完全独立的PCIe路径。命名空间共享指的是多个主机可以通过不同的NVMe控制器接入同一个命名空间,要求NVM子系统包含多个控制器。
下图(1)是没有多路径IO和命名空间共享的情况,NVMe控制器下的NSID互不相同。图(2)是有命名空间共享没有多路径IO的情况,两个控制器用一个PCIe端口(一个为Func0一个为Func1),共享一个命名空间(在控制器内必须用相同的ID)。当共享命名空间的控制器存在并发访问该命名空间时,应设置控制器支持原子操作,并可采用不同的优先级。
图2-3(3)是有多路径IO和命名空间共享的情况,这样的情境中,两个PCIe端口是完全独立的。
NVMe对SR-IOV的支持示意图(不一定只有一个PCIe端口)如下。图中可看出NVM子系统只有一个物理Func0,其余4个均为虚拟Func(0, x)。
每个虚拟Func都有一个与之关联的NVMe控制器,且每个控制器有一个私有的命名空间和同一个共享的命名空间。通过这样的方法,实现了PCIe的扩展,允许上层运行的虚拟机能够高效的共享PCIe的硬件资源。
硬件形态上,和传统SCSI盘比较,NVMe子系统直接通过PCIe总线和主机连接,路径中不再需要HBA卡,降低了系统开销。
NVMe子系统内部组成:
至少一个PCIe port,用于外部连接至少一个NVMe controller,该controller是实现了NVMe逻辑的PCI function名字空间标识(NSID)即LUN号名字空间(NS)即LBANAND Flash介质 (上图未标出)
NVMe和传统SCSI体系比较,在主机侧,NVMe子系统减少了IO调度层,单独的命令层,IO路径更短,为低延迟提供了保障。
NVMe存储设备涉及的主机侧软件栈包括: NVMe驱动,虚拟块管理层,文件系统层。NVMe规范重新设计定义了I/O队列机制及相应的仲裁机制,较传统的SCSI体系软件栈减少了实现排队功能的通用IO的调度层。NVMe驱动同时实现了底层传输和设备操作命令,较传统SCSI体系减少了单独的命令层。
推荐阅读:
阿里大牛深入分析分布式事务相关问答
bio设置中显卡错误报告为何要关闭? BIOS设置选项中Plug& play...BIOS里面的这个功能对windowsXP以上的系统来说意义不大,因为windows系统也有plugandplay服务。对windows以外的其他系统,也许有关键性的作用。有用(0)回复....
SSD固态硬盘掉盘是什么意思?掉盘则属于严重故障,是指SSD导致的Windows在正常使用过程中突然卡住停止响应(有时会表现为蓝屏)。有些掉盘在电脑从休眠状态唤醒时出现,有些则是在重负载写入...