与磁盘相比,SSD具有很高的IO性能,但是和磁盘相比,SSD的性能稳定性不如磁盘好。在使用过程中,SSD的性能会发生变化,而不能保持很强的一致性。这是SSD的一个特性,性能会随着时间、使用寿命发生变化。对于存储系统设计而言,这种不确定的性能变化以及抖动都会对系统整体性能造成影响。因此,对于闪存存储系统设计者而言,需要了解SSD内部的工作机制以及熟悉导致IO抖动的因素。

 

可能大家会说,SSD性能发生变化的一个重要因素是内部GC(垃圾回收)机制的影响。其实不全是,GC会导致SSD性能发生变化,NAND Flash上的数据布局方式会对GC性能造成影响,其本质问题是数据迁移与用户IO之间的资源竞争。另外,企业级SSD标称的性能往往都是在GC全速运行情况下的稳态性能,而不是出厂时的空盘性能。所以,在一般情况下,应用测试的IO稳定性都还是可以的。存储系统在使用SSD时,也都会只考虑稳态性能,而不是空盘性能。问题是在稳态性能情况下,在不同的IO Pattern情况下,不同的使用寿命情况下,其性能稳定性、IO抖动性还会发生变化。而这种性能变化恰恰是存储系统设计者需要考虑和解决的重要问题。对于存储系统设计者来说,不能将SSD当成一个黑盒进行使用,这是与磁盘存储系统设计来说是一个重大差别。


wKioL1g5eIygkqcbAAA1PjA0Ei8634.jpg


纵观SSD的设计,我们可以发现影响SSD性能不稳定的因素有很多,其中主要因素有NAND介质本身的比特错误;读与写、擦除的冲突;Read DisturbGC等问题导致性能变差。从外在表现来看,Bit Error的增多会导致SSD在使用过程中出现性能抖动问题,尤其是随着使用寿命的耗尽,SSD性能会发生明显的变化。另外在不同的IO Pattern下,性能也不尽相同,有些SSD甚至会存在写后读的问题,紧随着写之后的读延迟会变得很大,达到毫秒级,这是由于内部IO冲突导致的。此外,在同一区域大量读之后,也可能发现性能会出现抖动,这也是由于内部的Read Disturb机制开始工作了,会与用户IO发生竞争,从而导致性能抖动,甚至下降。

 

NAND Flash作为半导体存储介质,其存在严重的比特错误(BitError)。不同制造工艺会导致NAND具有不同的比特出错率;不同的NAND类型,MLCTLC以及未来的QLC都会具有不同的比特出错率;3D TLC在使用不当的情况下,其出错概率会发生变化;不同的使用寿命状态,NAND存放时间,其比特出错概率也会发生变化。所以,对于NAND介质来说,多种因素会导致出错概率发生变化。对于SSD而言,这种Error Bit会导致IO的性能发生不确定的抖动。例如对于读操作,如果Bit Error控制在一定范围之内,BCH或者LDPC解码器可以快速解码,那么一个正常的读请求可以控制在100us左右。如果Bit Error超出了快速解码的范围,那么解码器将会花费大量的时间进行解码,引入延迟;如果Bit Error过多,解码器无法进行正确解码,那么在SSD内部会通过Read Retry机制尝试通过调整NAND的参考电压来重新读取数据,这必然会导致更大的延迟;如果read retry也搞不定,那么需要依赖企业级SSD内部的NAND级别RAID来进行数据恢复,同样需要引入很大的延迟。当一个盘的使用寿命在不断耗尽的过程中,NAND FlashBit Error错误将会呈上升趋势,而很多译码器的解码能力不会呈现线性变化趋势,而更多的会呈现突变,类似于e指数变化趋势。也就是说当Bit Error的数量达到一定程度之后,译码时间将会急剧增加,从而导致IO延迟急剧增加,外在表现为IO性能的急剧抖动。

 

读写冲突、读写与擦除之间的冲突也是导致IO抖动的重要因素。当一个读请求和擦除请求落在了同一个通道的相同Die上,那么读请求将会由于擦除操作而被迫等待。NAND Flash的擦除操作基本上在2ms以上,如果发生这种冲突,那么IO的延迟将会从100us提升到2ms以上,从而发生严重的延迟。为了解决这个问题,现在有些NAND也会提供Erase Suspend的功能,通过该命令让擦除操作暂停,让读操作先进行,从而降低读延迟。在SSD内部的读写冲突也会引入延迟,当读写操作发生在同一个Block时,会导致读延迟增加。针对这个问题,在存储系统设计过程中,需要将读写请求在空间上进行分离,从而避免读写请求在同一个Block上冲突。

 

NAND Flash存在Read Disturb的问题,当NANDFlash一个区域被重复读之后,其Bit Error将会上升。为了解决该问题,SSD内部的Firmware会进行Read Disturb的处理。一个区域被重复读取之后,会进行数据搬移操作,该操作过程类似于Garbage Collection过程。一旦该过程被触发之后,SSD内部的IO请求数量将会上升,从而对读请求造成一定的影响,导致性能降低及抖动。

 

SSD作为一种半导体存储介质,其性能通常会高于磁盘,但是在极端情况下,由于IO Pattern导致的读写冲突,Bit error的增加都会导致SSD性能的变化,并且出现性能抖动的问题。此外,SSD对于顺序写、随机写、顺序读、随机读以及混合读写情况下的性能都会有所变化,并且不同的IO Pattern会导致数据在NAND上的布局发生变化,从而会导致各种读写情况下的性能都有所变化。例如,全盘顺序写之后的顺序写性能会比较高,但是在全盘随机写之后的顺序写性能会略差。其中的核心原因在于NAND上的数据布局初始条件的不同,GC行为会发生差异,从而导致后面的业务IO性能发生变化。在磁盘存储中不存在这些因素,但是在SSD存储中,一定需要考虑SSD固件的行为。一个比较好的设计是让SSD内部的FTL工作在最佳状态下,从系统软件层面整体控制存储IO的行为,从而保证IO的性能一致性,防止IO出现不确定的抖动。