背景
SSD(固态硬盘)是目前处于全盛时期的存储设备。与传统硬盘存储器(HDD)相比,由于消除了机械部件,消除了高延迟的查找过程,大大提高了随机存取,显著降低了功耗。随着近几年的蓬勃发展,与HDD相比在成本上并没有明显的劣势。相比3D XPoint等最新NVRAM存储技术,SSD更加成熟,大量存储和数据库应用的成功应用经受住了市场的考验。是目前生产级大型仓储系统的中流砥柱。
本文收集了大量的数据,并在总结固态硬盘体系结构和特点的基础上,帮助软件程序员找到如何构建一个基于固态硬盘的高质量、高效率的存储系统。
解构固态硬盘
一个SSD主要由IO接口、控制器芯片、DRAM缓存和NAND闪存芯片组成。其架构可以如下图所示。
修改page-0,page-0在擦除之前无法再次写入,于是写入一个新的版本,存在page-3,并在FTL中修改映射相同的LBA到新的page再次修改page-1,则把所有page都拷贝到一个新的block,把老的block擦除,并更新FTL从上面的例子中不难看出,FTL需要一个映射表来完成从LBA到(块,页)的映射。映射表将存储在动态随机存取存储器中,以确保控制器的高速访问。同时可以在断电前持久化到NAND闪存。
不难想到实现FTL最幼稚的算法。有两个极端,一个是做页面级映射转换,一个是做块级映射转换。按页级映射转换的问题是,映射表占用的空非常大,而按块级,P/E过程中的写放大比会增加。因此,产品级固态硬盘将采用一些优化的块-页混合映射算法。
垃圾回收
由于NAND闪存在下一次编程之前必须擦除一次,并且擦除的粒度和时间消耗相对较大,SSD产品会在NAND闪存上封装垃圾收集功能:
在更新一个Page的时候不直接执行擦除操作,而是写入一个新的Page,并且在FTL中标记老的Page无效垃圾回收逻辑在恰当的时机(通常是空闲时),选择恰当的Block(无效Page较多),把当中仍然有效的Page拷贝到其他Block,并执行Block的擦除操作在FTL中标记Block的所有Page可写如果垃圾收集速度能跟得上页面失效速度,SSD会尽量把垃圾收集放在后台,否则写的时候就得垃圾收集,验证会影响写性能。
磨损均衡
如上所述,每个单元的最大市盈率是有限的,因此控制器需要设计巧妙的算法,使市盈率尽可能均匀地分布在每个块上。一般情况下,为了提高整体使用寿命,SSD产品还会提供NAND闪存存储空,对于部分用户来说是不可见的,在局部磨损不均匀的情况下会进行升级,这种情况称为过度配置。
固态硬盘的多级并行机制
相比HDD,SSD的优势主要来自于移除机械部件后单次读取延迟的显著增加。如果只看一个NAND闪存,它提供的带宽其实并不高,只有不到100 MB/s,为了提高吞吐量,在SSD中实现了多级并行优化技术,大大提高了整体SSD吞吐量,高达10 GB/s。
如下图所示,SSD分层管理NAND闪存。控制器与与非门闪存芯片在多通道通道中连接。每个通道的吞吐量低于100MB/s,一个或多个与非门闪存芯片可以通过总线连接。每个与非门闪存芯片内部封装有多个管芯,每个管芯设置有多个平面,每个平面包含多个块,每个块包含多个页面。
SSD基于多级NAND闪存管理,实现多级并行机制:
Channel级别:Controller可以同时使用多个Channel在不同的NAND Flash Chip上执行不同的操作Chip级别:连接在相同Channel上的不同的不同Chip,也可以使用流水线(Interleaving)的方式同时执行不同的命令Die级别:一个Chip封装多个Die,Chip可以把不同的命令发送到多个Die上并行执行Plane级别:一个Die包含多个Plane,相同的命令(读、写、擦除)可以在一个Die的多个Plane上同时执行以下是芯片级并行使用的流水线技术的简要说明:
写操作分两步完成:
把数据载入到Chip内部的寄存器根据寄存器中的数据在NAND Flash芯片上执行编程操作与非门闪存芯片的编程时间比将数据加载到寄存器中的时间长得多,因此可以通过流水线操作来提高吞吐量。
集群块:使用SSD多级并行机制,可以并行访问的最大块数集合称为一组集群块。
程序员打开SSD的正确方法
基于固态硬盘在存储介质、运行模式和多级并行机制方面的特点,本节总结了如何使用固态硬盘为程序员构建高效存储系统的一些基本原则。
为了方便下面的描述,先定义什么是IO操作中的顺序读写和随机读写:如果一个读写操作访问的LBA是最后一个读写操作访问的最后一个LBA+1,那么这个读写操作叫做顺序读写操作,否则这个读写操作叫做随机读写操作。
另外,定义什么是大块读写,什么是小块读写:如果一次读写操作中读写的数据大于或等于SSD Cluster Block的大小,那么这样的读写操作称为大块读写;否则,小于集群块大小的读写操作称为小块读写。
写操作的优化
大块写是SSD最友好的写操作模式。借助FTL和多级并行技术,固态硬盘可以分解一个大块写操作,并在多个集群块上并行执行,有效减少延迟,提高吞吐量。
顺序书写和随机书写的区别
如果每次写入操作中写入的数据量很小,顺序写入的吞吐量明显高于随机写入。虽然固态硬盘的多级并行机制可以在集群块上并行执行写操作,无论是小随机写还是小顺序写,两者的区别主要体现在以下两个方面:
小块随机写将导致更多的FTL映射表更新,而顺序写可以合并FTL映射表的更新,显著降低映射表更新的开销小块随机写更容易造成某个Block中少量的Page被设置为无效,需要进行擦除,加剧垃圾回收过程的写放大如果随机写入的数据比较大,上述两种影响会明显降低。当每次写入的数据块达到群集块的大小时,顺序写入和随机写入的性能将保持不变。
单线程写和并发写的区别
单线程块写最快。如果是大块写,不需要做多线程并发写,多线程并发写会因为竞争而增加写操作的延迟。如果是小块写,多线程并发写有助于提高SSD多级并发机制的效率,提高吞吐量。下表详细总结了上述内容:
大块写小块写单线程最快最慢多线程并发无助于吞吐量,提高时延有助于提高多级并发机制的利用,提高吞吐量读取操作的优化
基于写入顺序的策略
由于消除了硬盘的机械部件和寻道时间,固态硬盘的读取操作不再像硬盘那样显示出顺序读取操作相对于随机读取操作的绝对优势。多级并行机制的利用决定了SSD读取操作的性能。只有在多个集群块上并行执行的读取操作能够被分解时,固态硬盘的最大性能才能得到充分发挥。
固态硬盘读取操作的优化被总结为“基于写入顺序”的原则。也就是说,读操作需要尽可能符合写操作的模式:写的时候把哪一页写在一起,那么读的时候也一起读。在写入时,SSD会尽量将写入的页面分散到多个Clustered Block进行并行化,所以如果同时读取这些页面,读取操作会得到最大的并行性。相反,如果读操作总是读取由不同写操作写入的页面,这些页面可能在同一平面上,必须串行读取。以下图为例,SSD有四个可以并行操作的平面,所有四个写操作都在这四个平面上并行执行。读1操作遵循“基于写顺序”的原则,可以并行读取四页。然而,因为Read-2不遵循“基于写顺序”的原则,所以四页读取落在同一平面上,必须串行执行。
所以,引入SSD一个有趣的特性并不难。将写操作优化为大块写不仅可以提高写操作本身的性能,还可以提高读操作的性能。因为如果写操作非常随机,每次写入的数据非常少,读操作很难遵循写操作的模式。大块写操作更适合读操作。遵循:一个简单原则是大块写-大块读,因此一个读操作将很大概率命中由一个写操作写入的大量页面。
单线程读取和并发读取的区别
多线程并发读取会使SSD中的一些预读机制失效,不建议多线程并发读取。符合写模式的单线程读取效率最高。
当然,对于大量的小块读取,多线程并发可以提高使用多级并发机制的概率。
读写混合负荷的优化
与并发读取一样,并发读写的混合操作也会对SSD中的一些预读机制产生负面影响。因此,处理读写混合负载的推荐方法是逐个执行大型读写操作。
冷热数据分离
热数据是指那些频繁更新的数据,冷数据是很少更新的数据。如果热数据和冷数据不同的页面放在同一个块中,更新热数据将与冷数据一起传输和擦除,这将带来更多的写放大。因此,将冷数据和热数据放在不同的块中可以减少包含冷数据的块被擦除的次数。
使整齐
在构建基于SSD的文件系统时,很容易出现这样的问题:删除文件系统中的一个文件,并不会真正释放文件占用的磁盘空,而只是将这些空标记为可用,等待后续写入新创建的文件。这样会导致SSD后台垃圾收集不及时,只有在本节空确实需要写入新文件时才会进行垃圾收集,从而影响写入性能。因此,SSD支持显示的TRIM操作,可由上层用户发送到SSD,指示可以释放哪个LBA 空。
此外,TRIM操作还可以结合上层应用知识删除批量数据。上层应用可以结合自己的管理策略,将数据删除操作累加在一起,通过TRIM操作批量执行,提高效率。
总结
本文总结了固态硬盘的基本结构和特点,以及程序员如何基于固态硬盘构建高效存储系统的几个基本原则。DRDS HTAP存储创建了一个高度可靠和高效的存储层,支持事务性和分析性数据库。还有很多工作要做。继续努力!
1.《ssd 【抠一抠】如何用好SSD》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《ssd 【抠一抠】如何用好SSD》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/fangchan/1494621.html