ssd磁盘存储原理及产生io抖动原因

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

存储原理

SSD主要由SSD控制器,Flash存储阵列,板上DRAM(可选)以及跟HOST接口(SATA、SAS、PCIe等)组成。

Flash的基本存储单元是浮栅晶体管,同时根据制造工艺分为NOR型和NAND型。NAND容量大,按照Page进行读写,适合进行数据存储,基本上存储使用的SSD的Flash都是NAND

Flash的工作原理和场效应管类似都是利用电压控制源极和漏极之间的通断来工作的。

写操作是在控制极加正电压,使电子通过绝缘层进入浮栅极。写操作如左图,是在上面的控制栅极加正电压Vpp,使电子通过绝缘层进入浮栅。写入的过程是充电子的过程,如果写入的page之前已经写过,在写入之前,必须先对flash进行擦除0,清除浮栅中的电子。

擦除(erase)操作与写正好相反,如右图,是在衬底加正电压Vpp,把电子从浮栅中吸出来。

读操作给控制栅加读取电压,判断漏极-源极之间是否处于导通状态,进而可以判断浮置栅有没有存储电荷,进而判断该存储单元是1还是0

根据制作工艺,闪存存储器可以分为NOR型和NAND型。

NOR型是为了替代EEPROM而设计,可以按位或者按字节进行访问,NOR型闪存芯片具有可靠性高、随机读取速度快的优势,但擦除和编程速度较慢,容量小,主要用于存储可执行的成都代码。

NAND闪存容量大,按页进行读写,容量大,适合进行数据存储。本文介绍都是基于NAND flash。

存储结构

SSD中一般有多个NAND-Flash,每个NAND-Flash包含多个Block,每个Block包含多个(一般256个)Page。由于NAND的特性,存取都必须以Page为单位,即每次读写至少是一个Page。通常地,每个Page的大小为4K或者8K。

 

NAND的另一个特性是只能读写单个Page,不能覆盖写某个Page,必须向空闲的page中写。当没有空闲page时就必须擦除一个page,由于擦除内容的电压较高,必须是以Block为单位,因此,必须要找到没有有效内容的Block,先擦除再选择空闲的Page写入。

SSD中也会维护一个mapping table,维护逻辑地址到物理地址的映射。每次读写时,可以通过逻辑地址直接查表计算出物理地址,与传统的机械磁盘相比,省去了寻道时间和旋转时间。

读写

从NAND-Flash的原理可以看出,其和HDD的主要区别为:

  • 定位数据快:HDD需要经过寻道和旋转,才能定位到要读写的数据块,而SSD通过mapping table直接计算即可。
  • 读取速度快:HDD的速度取决于旋转速度,而SSD只需要加电压读取数据,一般而言,要快于HDD。

顺序读测试中,由于定位数据只需要一次,定位之后,则是大批量的读取数据的过程,此时,HDD和SSD的性能差距主要体现在读取速度上,HDD能到200M左右,而普通SSD是其两倍。

随机读测试中,由于每次读都要先定位数据,然后再读取,HDD的定位数据的耗费时间很多,一般是几毫秒到十几毫秒,远远高于SSD的定位数据时间(一般0.1ms左右),因此,随机读写测试主要体现在两者定位数据的速度上,此时,SSD的性能是要远远好于HDD的。

SSD的写分为新写入覆盖写两种,处理流程不同。

新写

覆盖写

GC

磁盘空间有一部分是Over-Provisioning,因为GC时需要一部分空间来做数据的腾挪,在ssd空间使用不多时排不上用场,但是当ssd空间快被用完时就可以使用Over-Provisioning来做gc,所以需要SSD提供额外空间即Over-Provisioning,保证GC的正常运行。

SSD的GC机制会带来两个问题:

  • SSD的寿命减少。NAND-Flash中每个原件都有擦写次数限制,超过一定擦写次数后,就只能读取不能写入了。
  • 写放大(Write Amplification)。即内部真正写入的数据量大于用户请求写入的数据量。

如果频繁的在某些Block上做GC,会使得这些元件比其他部分更快到达擦写次数限制。因此,需要损耗均衡控制(Wear-Leveling)算法,使得原件的擦写次数比较平均,进而延长SSD的寿命。

Trim机制

Trim指令也叫Disable Delete Notify(禁用删除通知),是微软联合各大SSD厂商所开发的一项技术,属于ATA8-ACS规范的技术指令。

Trim(Discard)的出现主要是为了提高GC的效率以及减少写入放大的发生,最大作用是清空待删除的无效数据。在SSD执行读、擦、写步骤的时候,预先把擦除的步骤先做了,这样才能发挥出SSD的性能,通常SSD掉速很大一部分原因就是待删除的无效数据太多,每次写入的时候主控都要先做清空处理,所以性能受到了限制。

在文件系统上删除某个文件时候,简单的在逻辑数据表内把存储要删除的数据的位置标记为可用而已,而并不是真正将磁盘上的数据给删除掉。使用机械硬盘的系统根本就不需要向存储设备发送任何有关文件删除的消息,系统可以随时把新数据直接覆盖到无用的数据上。固态硬盘只有当系统准备把新数据要写入那个位置的时候,固态硬盘才意识到原来这写数据已经被删除。而如果在这之前,SSD执行了GC操作,那么GC会把这些实际上已经删除了的数据还当作是有效数据进行迁移写入到其他的Block中,这是没有必要的。

在没有Trim的情况下,SSD无法事先知道那些被‘删除’的数据页已经是‘无效’的,必须到系统要求在相同的地方写入数据时才知道那些数据可以被擦除,这样就无法在最适当的时机做出最好的优化,既影响GC的效率(间接影响性能),又影响SSD的寿命。

Trim和Discard的支持,不仅仅要SSD实现这个功能,而是整个数据链路中涉及到的文件系统、RAID控制卡以及SSD都需要实现。要使用这个功能必须要在mount文件系统时,加上discard选项。如果自己管理SSD裸设备就需要通过ioctl函数BLKDISCARD命令来操作了。

Bit-Error

在分析Bit-Error之前,我们先回顾一下闪存基础章节的知识。Bit-Error是磁盘的一种静默错误。造成Nand-Error的因素有:

  • 电荷泄漏:长期不使用,会发生电荷泄漏,导致电压分布往左移,例如00漂移到01,10漂移到11。
  • 读干扰(Read-Disturb):后面介绍。
  • 写干扰(Program-Disturb):后面介绍。

不同因素造成的错误类型也不同:

  • Erase-Error:erase操作未能将cell复位到erase状态时,称为erase error。可能是制造问题,或者多次P/E引起的栅极氧化层缺陷所致。
  • Program-Interference-Error:由Program-Disturb所导致的错误,会使电压分布偏移。
  • Retention-Error:由电荷泄露引发的错误,会使电压分布偏移。
  • Read-Error:由Read-Disturb所导致的错误,会使电压分布偏移。

retention时间越长,flash的浮栅极泄露的电子会越多,因而误码率越高,所以NAND-Error机制主要是为了减少Retention-Error。

Read-Disturb

读取NAND的某个Page时,Block当中未被选取的Page控制极都会加一个正电压,以保证未被选中的MOS管是导通的。这样频繁的在一个MOS管控制极加正电压,就可能导致电子被吸进浮栅极,形成轻微的Program,导致分布电压右移,产生Bit-Error。注意Read-Disturb只影响同一Block中的其他Page。

Program--Disturb

Program操作是在Block擦除的基础上,通过往浮栅极注入电子,实现1变为0,同一个Page,存在Program Disturb。如果往某个存储单元写入1,我们认为这个比特可以不做Program操作,因为擦除后的存储单元,里面数据本来就是1;如果我们写入的是0,则真正需要做Program操作,即把之前的1改写为0。我们在写一个Page的时候,本来某些bit我们想写入1,但最后却写成0。

Io抖动分析

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

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

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章