SSD内部的IO抖动因素

简介:

与磁盘相比,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出现不确定的抖动。

 


本文转自 wuzhongjie 51CTO博客,原文链接:http://blog.51cto.com/alanwu/1876910,如需转载请自行联系原作者

相关文章
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
5月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
3月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
245 12
|
4月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
54 2
|
4月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
4月前
|
缓存 Java
【IO面试题 一】、介绍一下Java中的IO流
Java中的IO流是对数据输入输出操作的抽象,分为输入流和输出流,字节流和字符流,节点流和处理流,提供了多种类支持不同数据源和操作,如文件流、数组流、管道流、字符串流、缓冲流、转换流、对象流、打印流、推回输入流和数据流等。
【IO面试题 一】、介绍一下Java中的IO流
|
5月前
|
存储 缓存 Java
Java零基础入门之IO流详解(二)
Java零基础入门之IO流详解(二)
|
5月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用