【FLASH存储器系列二十】固态硬盘之RD&DR&SCL Cache

今天介绍SSD的几个特性:RD、DR、SLC Cache。

1、RD:Read Disturb

对一个闪存块来说,每次读其中的一个闪存页,都需要在其他字线(Wordline)上加较高的电压以保证晶体管导通。对这些晶体管来说,有点像在做轻微的“写入(Program)”,长此以往,由于电子进入浮栅极过多,从而导致比特翻转:1→0。当出错比特数超出ECC的纠错能力时,数据就会丢失。由于每次都是很轻微的写入,要使存储单元数据发生变化,不是一朝一夕的事情,而是长期积累的结果。因此,如果我们能保证某个闪存块读的次数低于某个阈值,在比特发生翻转之前(或者翻转的比特低于某个值时),就对这个闪存块上的数据进行一次刷新:把闪存块上的数据搬到别的闪存块上(或者先搬到别的闪存块上,然后擦除原闪存块后,再复制回来),防患于未然,这样就能解决RD导致数据丢失的问题。因此,FTL应该有记录每个闪存块读次数的一张表:每读一次该闪存块,对应的读次数加1。当FW检测到某个闪存块读的次数超过某个阈值,就刷新该闪存块。当数据写到新的闪存块后,读次数归零,一切重新开始。每个闪存块的读次数,掉电时应该保存到闪存上,重新上电时,再加载它们。事实上,当某个闪存块上的读次数超出阈值时,上面的数据翻转可能并没有超过很多(可设阈值),这种情况就没有必要立刻刷新。毕竟,刷新代来的读数据和写数据,需要耗时间和擦写次数,对性能和闪存寿命有影响。因此,有些FTL为避免“过”刷新,可能会在读次数超过阈值后,先检测比特翻转数,然后决定是否真正需要刷新,如果不需要立刻刷新,会重新设置一个更大的阈值,待下次读的次数达到新阈值后,重复之前的操作。关于读阈值,过去的FTL在SSD的整个生命周期中,都是用一个固定的值,这种处理简单粗暴,很不科学(但固件实现简单)。其实,RD与闪存的年龄有关:年龄越大(PE越大),对RD的免疫力越低。因此,对阈值的设定,采用动态的才是合理的,即对不同的PE,读阈值应该不同。具体来说,PE越大,读阈值应该越小。关于刷新动作,有Block(阻塞)和Non-block(非阻塞)两种处理方式。所谓阻塞方式,就是固件把其他事情都放在一边,专门处理闪存块的刷新;所谓非阻塞方式,就是闪存块的刷新与其他操作同时进行(Interleave操作)。前者处理方式劣势明显,那就是带来很长的命令时延:在处理闪存块的刷新的时候,就不能执行读写操作,导致读写推后。随着闪存块尺寸的增大,这种处理方式的劣势越发凸显。所以,现在的FTL一般都采用非阻塞的刷新处理方式。

2、DR:Data Retention

绝缘氧化层把存储在浮栅极的电子关在里面,但是,随着时间的推移,还是有电子从里面跑出来。当跑出来的电子达到一定数量时,就会使存储单元的比特发生翻转:0→1(注意,RD是使1翻转为0),当出错比特数超出ECC的纠错能力,数据就丢失。这就能解释为什么你的固态硬盘如果很长时间不用,可能就启动不了,或者启动很慢(固件需要处理由于DR引起的数据错误)的现象了。问题来了,为什么SSD长久不用数据就会丢失,而经常使用却不会呢?原因是FW或者FTL立功了。针对DR这个问题,稍微好一点的SSD, FTL都会有相应的处理。怎么处理呢?FTL在SSD上电或者平时运行时,每隔一段时间对闪存空间进行扫描,当发现比特翻转超出一定阈值时,跟RD处理一样,进行数据刷新,这样就能避免数据彻底丢失。SSD如果常年不上电,FTL根本就没有机会执行这些操作,只能眼睁睁地看着电子流失。

3、SLC Cache

SLC相对MLC和TLC来说,有更好的读写性能和更长的寿命。所谓SLC cache,就是把MLC或者TLC里面的一些闪存块配置成SLC模式来访问,在SSD还比较空的时候,使用SLC的存储空间,以获得更好的性能。

使用SLC Cache的出发点,主要有以下几点:

1)性能考虑:SLC性能好,用户数据写到SLC比直接写到MLC或者TLC上快很多。

2)防止Lower Page数据被带坏:用户数据写到SLC,不存在写Upper Page或者ExtraPage带坏Lower Page数据的可能。

3)解决闪存的缺陷:比如有些MLC或者TLC的闪存块,如果没有写满,然后去读的话,可能会读到ECC错误,而对SLC模式下的闪存块,就没有这个问题。

4)更多的数据写入量:SLC更耐写。

一般只有消费级SSD或者移动存储(比如eMMC、UFS等)使用SLC Cache,因为使用SLC Cache具有更好的突发性能;对企业级SSD来说,它追求的是稳态速度,它不希望SSD一下子速度飙升(写SLC),然后一下子速度急剧下降(写TLC)。另外,消费级SSD和移动存储产品一般都没有电容保护,使用SLC Cache能保证Lower Page数据不丢失;而企业级SSD一般都配有电容,能保证闪存的正常写入,它不存在Lower Page数据被带坏的问题,所以没有必要采用SLC Cache这种手段来保护数据。

SLC Cache写入策略有:

1)强制SLC写入:用户写入数据时,必须先写入到SLC闪存块,然后通过GC搬到MLC或者TLC闪存块;

2)非强制SLC写入:用户写入数据时,如果有SLC闪存块,则写入到SLC闪存块,否则直接写到MLC或者TLC闪存块。

强制写入策略能保护Lower Page数据,而后者不能。非强制SLC写入策略,具有更好的后期写入性能,因为在SLC闪存块耗尽的情况下,用户数据直接写入到MLC或者TLC;而对强制写入SLC策略来说,它一方面要把SLC的数据搬到MLC或者TLC,以腾出SLC空间供新用户数据的写入,同时又要把用户数据写入到SLC,性能肯定比只写MLC或者TLC慢。在这里可能有的读者有疑惑,强制写入SLC策略,SLC数据最后都要搬到MLC或者TLC,所以还是存在直接写MLC或者TLC的事实,也就是还是存在Lower Page数据被带坏的可能。是的,没错,做GC(数据搬移)是有这个问题。但是,如果我们在目标闪存块没有被写满前,不把源闪存块擦除,这样即使Lower Page数据被带坏,它还是能通过读源闪存块恢复数据,是不是?

根据SLC闪存块的来源,有以下几种SLC Cache办法。

1)静态SLC Cache:拿出一些Block专门用做SLC Cache;

2)动态SLC Cache:所有的MLC或者TLC都有可能挑来当SLC Cache, SLC和TLC不分家;

3)两者混合:即既有专门的SLC闪存块,还能把其他通用闪存块拿来当SLC Cache。

文章参考自《深入浅出SSD:固态存储核心技术、原理与实战SSDFans》。

你可能感兴趣的:(FLASH存储器,嵌入式硬件,硬件工程)