闪存介质的大规模使用给传统存储系统的设计带来了强烈的冲击,传统存储系统的很多设计理念不再适用于闪存存储系统。传统存储在设计过程中紧紧围绕磁盘抖动问题,所以在数据布局方面会适应磁盘的顺序读写特征。在设计过程中会大量采用内存作为磁盘缓存,利用数据局部性特征过滤掉大量的磁盘操作,并且将小写聚合成大写;在IO调度器方面,通过LBA的调度将地址临近的IO进行聚合,从而可以优化IO Pattern,使得磁盘的读写操作具有更强的顺序性;在磁盘内部,通过NCQ方式减少磁头的抖动,根据磁头当前所在位置对输入IO进行重新排序与调度,从而达到减少磁盘抖动的目的,提升磁盘访问性能。但是在SSD这种介质上,磁盘所存在的IO特性已经荡然无存,传统对磁盘所做的大量优化并不能给SSD带来价值,在有些情况下反而会影响性能。在基本存储介质、存储原理发生变革的情况下,存储系统软件的设计也需要做出调整,闪存系统设计一方面需要充分利用SSD带来的价值,另一方面需要规避SSD所存在的问题。总的来说,如下图所示,存储系统设计需要紧紧围绕应用与介质特性。磁盘和SSD相比存在一些共同的特性,但是各自又存在自己独特的特性。为了更好的发挥SSD特性,满足应用需求,需要设计面向SSD的存储软件系统。
面向SSD设计的存储系统软件,一方面需要发挥SSD的特性,另一方面需要规避SSD的问题。NVMe SSD具有的特性可以归纳如下:
1, 具有极高的顺序写性能,一般的随机写性能。SSD内部采用日志型的写入方式,新写入的数据都会被写入到新的NAND单元,并且建立LBA与PBA之间的映射关系。正因为如此,SSD内部存在垃圾回收机制,对无效LBA映射单元进行回收。垃圾回收会对SSD性能产生重大影响,通常所说的SSD稳态性能,就是在SSD内部垃圾回收单元正常运行情况下的测试结果。对于大块顺序写来说,每次写入的LBA都是连续的,因此可以大大简化SSD内部的垃圾回收运行机制,减少垃圾回收过程中的数据搬移操作,从而提升SSD的整体性能。对于随机写操作,LBA地址与PBA进行杂乱映射,垃圾回收过程中存在大量的数据搬移操作,一方面影响SSD的写放大;另一方面会造成SSD性能下降。因此,对于NVMe SSD来说,顺序写性能要高于随机写性能。为了最大程度的发挥SSD性能,对SSD尽可能采用顺序写入的方式,并且采用与SSD内部Data Frame对齐的大数据块方式,这是对SSD最为友好的IO模式。
2, 具有极高的随机读性能。SSD内部采用NANDFlash存储介质,对于这种介质不存在类似磁盘的随机读问题。对于读请求,在SSD内部的固件首先将LBA转换成PBA,然后从NAND介质上读取数据。
通过SSD的读写特性分析,我们设计了以RISL架构为核心的存储系统。RISL是Random Input Stream Layout的缩写,该架构最大的特性是充分利用NVMeSSD的读写特性,将业务的随机IO写请求转换成顺序数据流写入SSD。在RISL层将写请求进行聚合,转换成顺序数据流之后再写入存储层,对于SSD而言可以做到顺序写入的效果,提升了SSD内部固件的工作效率,从而提升系统整体性能。在读请求处理方面,RISL内部建立了请求映射表,通过请求映射表将用户请求转换至SSD请求,对于SSD而言实现了读请求随机访问的目的。RISL架构的存储系统框架如下图所示:
RISL系统分成两大部分,一部分是StorageService System,该部分负责写请求顺序化以及读请求的映射处理,并且在写请求处理过程中可以加入数据去重、压缩等机制,更加高效的使用SSD存储空间;另一部分是FlashRAID存储层,对外提供存储对象Container。FlashRAID提供的存储对象分为两大类,一类为Sealed Container,该类对象具备只读特性;另一类为Active Container,具备可写特性。写数据流只会往Active Container中写入数据,当Active Container被写满之后,该类对象会转换成Sealed Container。为了保证在系统突然断电情况下的数据一致性,设计采用了NVDIMM存储介质,通过该介质对用户数据进行聚合处理,将随机的业务写数据转换成顺序数据流。聚合完成的顺序数据流通过数据去重引擎以及数据压缩引擎进行数据缩减操作,提升SSD的利用率。在数据写过程中会产生大量的元数据,这些元数据都具有小数据的特性,通过NVDIMM的聚合首先将元数据转换成大数据块,然后再写入持久化SSD介质,这样可以避免元数据操作引入的小写问题。
对于读操作,逻辑处理过程比较简单,在RISL架构中维护了一个数据映射表格,通过该表格实现业务请求与SSD请求之间的映射。SSD请求在存储介质上随机分布,获取并发读取效果。RISL架构中的数据映射表格容量与存储容量相关,为了提升IO性能,该映射表格通常会全部加载在内存中。此外,该表格在写处理过程中会对其进行修改,在读操作过程中会对其进行检索,因此,如何保证该表格的并发访问是设计与实现的重点。
存储系统的设计本质上就是数据布局的设计。从数据布局的角度来看RISL,其可以很好的与NVMe SSD的特性进行匹配。下图所示是RISL架构的数据布局图:
其中绿点表示读请求,红点表示写请求。从图中可以看出写请求在SSD上具有很强的局部性,具备顺序写的特点;读请求在SSD上具有很强的离散性。读写请求在SSD上没有冲突,但是在NVDIMM中具有混合访问特性,也就是说热点数据在NVDIMM中进行处理,避免读写在SSD中冲突,从而可以缓解读请求由于写请求而引入的延迟的问题。从图中也可以看出RISL架构的数据布局与磁盘存储系统的数据布局完全不同,从而也说明了RISL是一种面向SSD设计、SSD友好的存储系统设计方法。
RISL架构设计还需要考虑的一个问题是数据回收(GarbageCollection)。由于RISL将用户随机写请求转换成了顺序IO流,简化了SSD内部的数据回收操作,该问题被转移到了系统层面去解决。由于系统层面离业务层更近,因此可以与业务进行配合更好的实现垃圾数据的回收。在面向Flash的存储系统设计中,有一种设计思路是将底层的FTL转移到系统层去实现,该想法的一个缺陷是需要定制化SSD,将NAND Flash的接口直接暴露给系统层。RISL架构可以在标准SSD上实现,但同样可以在系统层实现垃圾数据块的回收,并且可以与业务配合提升闪存存储系统的性能。这是RISL架构的优势。
在RISL架构设计的基础上,我们实现了闪存存储系统的原型系统。如下图所示,在多块Intel NVMe SSD盘的基础上,当写IOPS达到80万时,IO的平均延迟可以控制在160us左右。达到了高IOPS、低IO延迟的设计目标。
NVMe SSD是未来的发展趋势,随着NVMe SSD在主存储领域的大规模应用,面向NVMe SSD的存储系统设计必将是一个热门话题。RISL架构是一种NVMe SSD友好的存储系统设计方法,符合了SSD的读写特性,可以很好的发挥SSD的性能优势。