资讯详情

闪存垃圾回收

转载自: [http://www.ssdfans.com]

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

SSD主控通过多个通道(channel)并行操作多块FLASH颗粒,类似RAID底层带宽大大提高。例如,假设主控和FLASH颗粒之间有8个通道,每个通道都有闪存颗粒,HOST与FLASH数据传输率为200MB/s。该闪存颗粒Page大小为8KB,FLASH page读取时间为Tr=50us,平均写入时间为Tp=800us,8KB数据传输时间为Tx=40us。那么底层读取的最大带宽是(8KB/(50us 40us))*8 = 711MB/s,最大带宽为(8)KB/(800us 40us))*8 = 76MB/s。从上面可以看出,为了提高底层带宽,可以增加底层并行颗粒的数量,也可以选择快速的FLASH颗粒(或者让速度慢的颗粒变快,比如MLC配成SLC使用)。

以8通道为例,我们来谈谈HOST怎么读写SSD。主控通过8个通道连接8个通道FLASH DIE,为了方便解释,这里只画了每一幅画DIE里的一个Block,每个小方块都表示一个Page (假设大小为4KB)。

  1. HOST写入4KB数据

  1. HOST继续写入16KB数据

  1. HOST继续写,最后整个Block都写满

当所有Channel上的Block都写满了,SSD主控会选择下一个Block继续以同样的方式写入。

HOST是通过LBA(Logical Block Address,访问逻辑地址块)SSD的,每个LBA代表着一个Sector(一般为512B大小),操作系统一般为4K为单位访问SSD,我们把HOST访问SSD基本单元称为用户页(Host Page)。而在SSD内部,SSD主控与FLASH之间是FLASH Page访问基本单元FLASH的,我们称FLASH Page为物理页(Physical Page)。HOST每写入一个Host Page, SSD主控会找一个Physical Page把Host数据写入,SSD内部还记录了这样一个映射(Map)。有了这样的映射关系,下次HOST需要读某个Host Page 时,SSD就知道从FLASH读取数据的位置。

SSD内部维护映射表(Map Table),HOST每写入一个Host Page,会产生新的映射关系,会加入(第一次写)或更改(覆盖写)Map Table;当读取某个Host Page时, SSD首先查找Map Table中该Host Page对应的Physical Page,然后再访问Flash读取相应的Host数据。

一张Map Table有多大呢?假设我们有256GB的SSD,以4KB Host Page例如,一共有约 64M(256GB/4KB)个Host Page,也就意味着SSD需要有64M大小的Map Table。Map Table中的每个Entry存储是物理地址(Physical Page Address),假设其为4Byte (32 bits) ,那么整个Map Table的大小为64M*4B = 256MB。

对绝大多数SSD,我们可以看到上面有板载DRAM,它的主要功能是存储这个映射表。也有例外,如基础Sandforce主控的SSD,它不支持板载DRAM,那么它的映射表存在哪里呢?SSD它的大部分映射都存储在工作中FLASH其中一部分存储在电影中RAM上。当HOST当需要读取数据时,对于有板载的数据DRAM的SSD只要搜索DRAM获得物理地址后访问映射表FLASH从而得到HOST数据.在此期间,只需要访问一次FLASH;而对Sandforce的SSD首先要看它Host Page相应的映射关系在吗?RAM内,如果是,那就好办了,根据映射关系直接读取FLASH;如果该映射关系不在RAM在内部,它首先需要从映射关系开始FLASH读取在里面,然后根据这个映射关系读取Host这意味着与数据相比DRAM的SSD,它需要读两次FLASH才能把HOST读取数据,底层有效带宽减半。对HOST随机阅读,因为电影RAM映射关系有限Cache命中(影片中映射关系)RAM)概率很小,所以基本上每次阅读都需要访问两次FLASH,所以我们可以看到基于此基础Sandforce主控的SSD随机读取性能是不太理想的。

继续回到以前SSD写操作。当整个SSD写完后,从用户的角度来看,如果你想写新的数据,你必须删除一些数据,然后在写作前腾出空间。用户在删除和写入数据的过程中会导致一些数据Block数据无效或老化。如下图所示(绿色小方块代表有效数据,红色小方块代表无效数据):

Block数据老化或无效意味着没有映射关系指向它们,用户不会访问它们FLASH它们被新的映射关系所取代。比如有一个Host Page A,开始它的存储FLASH空间的X,映射关系为A->X。后来,HOST重写了该Host Page,由于FLASH不能盖写,SSD内部必须找到一个未写的位置来写新数据,假设是Y,此时建立了新的映射关系:A->Y,以前的映射关系解除,位置X上的数据老化失败,我们称之为垃圾数据。

随着HOST持续写入,FLASH存储空间慢慢变小,直到耗尽。若不及时清除这些垃圾数据,HOST不能写。SSD内部有垃圾回收机制,其基本原理是把几个Block有效数据(非垃圾数据,上图绿色小方块表示)集中搬到一个新的Block上去,然后把这些Block擦除掉,这样就产生新的可用Block了。

上图中,Block x上述有效数据为A,B,C,Block y上述有效数据为D,E,F,G,红方块是无效数据。垃圾回收机制是先找一个未写过的可用Block z,然后把Block x和Block y移动有效数据Block z上去,这样Block x和Block y上面没有有效的数据,可以擦除成两个可用的数据Block。

一块刚买的SSD,你会发现写入速度很快,因为一开始总能找到可用的东西Block写入。但是,随你对SSD的使用,你会发现它会变慢。原因就在于SSD当你需要写新的数据时,你通常需要回收上述垃圾:把几个Block上述有效数据移动到某个数据Block,然后擦掉原来的Block,然后把你的Host数据写入。这比最初简单地找到一个可用的Block写起来要花很多时间,所以速度慢是可以理解的。

以上图为例。假设HOST要写入4KB数据 (H) ,目前可用Block过少,SSD开始回收垃圾。从上图可以看出,是的Block x它需要把Page A,B,C读出并写入数据Block z,然后Block x擦除用于HOST数据写入。从Host角度,它只写了4KB数据,但从SSD在内部,它实际上写入了四个Page(Page A, B, C写入Block z,4KB数据H写入Block x)。

2008年,Intel公司和SiliconSystems公司(2009 年被西部数字收购)首次提出写入放大(Write Amplification)并在公开稿件中使用此术语。

在上面的例子中,Host写了4KB数据,闪存写4个4KB因此,上述例子中的写作放大为4。

对于空盘,写放大一般为1,即Host写多少数据,写多少数据FLASH也是数据量。在Sandforce在控制器出来之前,最小放大值为1。但是由于Sandforce内部有一个压缩模块,对准Host实时压缩写入的数据,然后写入NAND。举个例子,HOST写入8KB压缩后,数据变为4KB,如果此时没有垃圾回收,那么写作放大只有0.5。Intel之前说写放大不能小于1,但是Sandforce打破这一说法。

写完放大,再谈预留空间(OP, Over Provisioning)。

假设一个SSD,底下所有FLASH容量为256GB,对用户开放也是256GB,然后问题来了。想象一个场景,HOST继续写整个SSD,然后删除一些文件,写入新的文件数据。新数据能写入吗?在SSD底层,要写新数据,必须有可用的空闲Block,但由于之前256GB空间已经被HOST数据占用,没有空闲Block写下你的数据。不,你刚才删除了一些数据吗?你可以回收垃圾。是的,但问题来了。在上面介绍垃圾回收时,我们需要有Block z写回收的有效数据,这个时候我们连续Block z找不到,谈什么垃圾回收?因此,用户最终写作失败。

上面的场景至少说明了一点,SSD内部需要预留空间(需要有自己的小金库,不能全额支付工资),这部分空间HOST看不见。这部分预留空间不仅用于垃圾回收,事实上,SSD一些内部系统数据也需要预留存储空间,如上述映射表(Map Table),比如SSD固件等SSD系统管理数据。

一般从HOST角度来看,1GB= 1,000,000,000Byte,从底层FLASH角度,1GB=1*1024*1024*1024Byte。256GB FLASH 为256*(2^30) Byte,而一般说的256GB SSD 容量为256*(10^9) Byte,这样,自然有(256*(2^30)-256*(10^9))/(256*(10^9)) = 7.37%的OP。

如果把256GB Flash容量的SSD配成240GB然后它的OP是多大呢?

(256*(2^30)-240*(10^9))/(240*(10^9)) = 14.5%

除满足基本使用要求外,OP变大有什么坏处或者好处呢?坏处很显然,用户能使用的SSD容量变小。那么好处呢?

回到垃圾回收原理。

再看一下这张图。回收Block x,上面有3个有效Page,需要读写3个Page完成整个Block的回收;而回收Block y时,则需要读写4个有效Page。两者相比,显然回收Block x比回收Block y快一些。说明一个简单的道理:一个Block上有效的数据越少(垃圾数据越多),则回收速度越快。

256GB FLASH配成256GB的SSD (OP = 7.37%), 意味着256*(10^9)的有效数据写到 256*(2^30)的空间,每个Block上面的平均有效数据率可以认为是256*(10^9)/256*(2^30) = 93.1%。

如果配成240GB的SSD,则意味着240*(10^9)的有效数据写到256*(2^30)的空间,每个Block的平均有效数据率为240*(10^9)/256*(2^30) = 87.3%。

OP越大,每个Block平均有效数据率越小,因此我们可以得出的结论:。这就是OP大的好处。

写放大越小,意味着写入同样多的HOST数据,写入到FLASH中的数据越少,也就意味着FLASH损耗越小。FLASH都是有一定寿命的,它是用P/E数 (Program/Erase Count)来衡量的。(关于FLASH基础知识,请参考《闪存基础》)。如果SSD集中对某几个Block进行擦写,那么这几个Block很快就寿命耗尽。比如在用户空间,有些数据是频繁需要更新的,那么这些数据所在Block就需要频繁的进行擦写,这些Block的寿命就可能很快的耗尽。相反,有些数据用户是很少更新的,比如一些只读文件,那么这些数据所在的Block擦写的次数就很少。随着用户对SSD的使用,就会形成一些Block有很高的PE数,而有些Block的PE数却很低的。这不是我们想看到的,我们希望所有Block的PE数都应该差不多,就是这些Block被均衡的使用。在SSD内部,有一种叫磨损平衡(Wear Leveling,WL)的机制来保证这点。

WL有两种算法:动态WL和静态WL。所谓动态WL,就是在使用Block进行擦写操作的时候,优先挑选PE 数低的;所谓静态WL,就是把长期没有修改的老数据(如前面提到的只读文件数据)从PE数低的Block当中搬出来,然后找个PE 数高的Block进行存放,这样,之前低PE数的Block就能拿出来使用。

下面这张图诠释了无WL,动态WL和静态WL下的FLASH耐久度的区别 (假设每个Block最大PE数为10,000):(图片来自http://www.ssdfans.com/wp-content/uploads/2015/05/9fb3_006.jpg)

可见,使不使用WL,以及使用何种WL算法,对SSD的寿命影响是很大的。

小结:本文介绍了SSD的一些基本原理,包括SSD底层FLASH阵列的实现,Host Page与Physical Page的映射及映射表,垃圾回收机制,写放大,OP和Wear Leveling等。虽然市面上有各种各样的SSD,但它们内部这些基本的东西都是相通的。理解了这些东西,就等于拥有了一把通向SSD世界的钥匙。

标签: mlc连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台