Writeamplification写入放大与SSD相关技术解析•写入放大Writeamplification•影响写入放大的因素•垃圾回收机制Garbagecollection•预留空间Over-provisioning•TRIM•均衡磨损WearLeveling•影响写入放大的其它因素写入放大Writeamplification•因为闪存的特性决定了.在写入数据之前必需先对闪存存储单元进行擦除才能改写.在执行这些操作的时候,移动(或重写)用户数据和元数据不止一次。这些多次的操作,减少了SSD的写入寿命.也增加了无谓的写入量.写入放大因子是SSD控制器实际写入区块的容量总和与实际文件大小的比值。写入放大为1时是最合适的,也就是说,你想写入16KB的文件,SSD实际写入了16KB的文件,更高的写入放大意味着SSD更短的寿命和更低的性能。因此.写入放大是衡量主控性能的重要指标.所有的算法优化技术都是为了降代写入放大.简单的写入放大公式NAND闪存基本知识•NAND闪存上写有数据的页面是无法直接进行重新写入的。如果需要进行重新写入的话,则必须分2步进行,首先进行数据擦除(ERASE),随后在写入新的数据(PROGRAM)。ERASE的操作就是将所有的bit都回复成1,而PROGRAM的操作,则是把其中需要的bit写为0。••通过向左边名为POLY1FLOATINGGATE的区域注入和提取电子来保存数据。FLOATINGGATE中没有电子的部分为1,已经被注入电子的部分则是0。已经注入的电子,通过被称为TunnelOxide的绝缘膜来保持电子的通电状态。一个闪存单元可以保存一比特(bit)的数据,当成千上万个单元同时集成进一片芯片中时,就可以保存成千上万个比特的数据了,再大的规模就是上GB存储量的NAND闪存颗粒了。但是,在不断反复的对FLOATINGGATE进行电子操作的过程中,TunnelOxide部分会产生老化。随后就无法保证已注入电子的通电状态。这就是NAND闪存存在着重写次数限制的原因.NAND闪存基本知识•闪存运作特性,写入最小单位是页,而擦除最小单位是块,.闪存有编程和擦除的次数限制,这样每次的编程/擦除就叫做1P/E(program/erasecycles)周期,而MLC一般是5000~10000次,而SLC是10万次左右.也就是说写入放大越低,P/E周期就越少,闪存寿命就越久。影响写入放大的因素•1.垃圾回收(GC)Garbagecollection•2.预留空间Over-provisioning•3.TRIM•4.均衡磨损WearLeveling垃圾回收(GC)Garbagecollection当SSD的所有块都已经写入了一次,SSD主控制器将会初始化那些包含无效数据的块。(陈旧数据,这些块里的数据已经被更新的数据替换,已经无效了,没了LBA地址),现在他们正在等待被删除,以便新的数据可以写入其中,如何优化并整理这些个等待被删除的无效数据,这个算法称为垃圾回收(Garbagecollection)•当有写入请求时,从“空闲区块池”中给这个请求分配一个新的区块,将新区块的地址信息加到“数据区块池”。包含无效数据的区块被清理,然后将地址信息添加到“空闲区块池”。有效数据会和写入请求一起写入到新的区块中.•WriteRequest-写入请求•DataPlacement-数据暂存•DataBlockPool-数据区块池•FreeBlockPool-空闲区块池后台GC与主动GC•后台GC后台垃圾收集算法(也称为闲置垃圾收集),该控制器会使用空闲的时间来做垃圾收集,让主控在使用时一直保持高性能。例如barefoot主控.在空闲的时候进行GC.以提高SSD性能.•主动GC主动GC需要有相当性能的主控制器,以保证在操作数据的同时进行GC操作,这类GC适合在服务器里用到,因为个人用户可以把电脑闲置了做GC,但是服务器可不行,所以要保证性能的话必须在运行的同时做GC,这对主控制器的性能提出了很高的要求,SandForce与MarvellBJP2的主控就是这类。•当只有较少几个区块可用于写入的情况.在这个例子中,清理机制(算法)只能在少数几个空白区块中进行操作,具有较多无效页面的区块被选中进行清理,当这些区块被清理,其地址信息加入到“空闲区块池”中后,原有的有效数据才会被拷贝到空闲区块中,接下来才轮到新进入的数据进行写入等操作。在最右边,你会看到接受到写入请求和将数据实际写入对应的区块中间的操作周期。当考虑到SSD进行的清理机制时,你会看到写入数据发生的延迟,这时便会产生写入放大Garbagecollection用于整理,移动,合并,删除闪存块来提升效率.虽然增加了写入放大,但是速度有提升。•WriteRequest-写入请求•WritetoaFreeBlock-写入空闲区块•SelectBlocktoCleaning-选择一个区块准备清理•ReplenishFreeBlock-补充空闲区块•WriteValidDate-写入有效数据•TotalDataWritten-所有数据写入均衡磨损WearLeveling•简单来说,就是用映射的方法,把将要写入的地址映射到写入次数最少的区块上面去,这样就达到了近量让FLASH芯片上各处的单元擦写次数保持尽量相似。大大延长了FLASH的使用寿命。图简单的存储单元寿命公式•一个特定的块被持续的编程写入而不编程写入到别的块,那么这个块将很快被消耗掉编程寿命,造成整个SSD的报废。处于这个原因,SSD主控制器要平均分配每个块的编程次数,这个技术就是磨损平衡。在最乐观的情况下,这个技术会让全盘的颗粒磨损程度接近并同时报废。但要磨损均衡需要牺牲写入放大,假设对于冷数据,必须经常的移动到别的块,再把热数据移过来,保证2边的块都是一样的磨损度,于是无谓的增加了写入次数。预留空间Over-provisioning•预留空间是指用户不可操作的容量,为实际物理闪存容量减去用户可用容量。这块取用一般被用来做优化,包括磨损均衡,GC,Trim和坏块映射。Over-provisioning的分层•Over-provisioning一共分为三层•第一层为固定的7.37%,这个数字是如何得出的哪?我们知道机械硬盘和SSD的厂商容量是这样算的,1GB是1,000,000,000字节(10的9次方),但是闪存的实际容量是每GB=1,073,741,824,(2的30次方),2者相差7.37%。所以说假设1块128GB的SSD,用户得到的容量是128,000,000,000字节,多出来的那个7.37%就被主控固件用做OP了。第二层来自制造商的设置,通常为0%,7%和28%等,打个比方,对于128G颗粒的SandForce主控SSD,市场上会有120G和100G两种型号卖,这个取决于厂商的固件设置,这个容量不包括之前的第一层7.37%。第三层是用户在日常使用中可以分配的预留空间,而用户也可以自己在分区的时候,不分到完全的SSD容量来达到同样的目的。(要有Trim支持)预留空间虽然让SSD的可用容量小了,但是带来了减少写入放大,提高耐久,提高性能的效果。TRIM•Trim是WIN7下的一个SSD优化指令,他能让操作系统在删除某个文件或者格式化后告诉SSD主控这个数据块不再需要了。一般情况下,当LBA被操作系统更新后,只有随着之后的每次数据写入(其实等于覆盖),SSD主控制器才知道这个地址原来早已经失效了。(之前认为每个数据都是有效的)在Win7里,由于Trim的引入解决了这个问题,当某些文件被删除或者格式化了整个分区,操作系统把Trim指令和在操作中更新的LBA一起发给SSD主控制器(其中包含了无效数据地址),这样在之后的GC操作中,无效数据就能被清空了,减少了写入放大同时也提升了性能。影响写入放在的其它因素•Sequentialwrites持续写入当SSD持续的写入数据时,写入放大一般为1,原因是随着数据写入,整个块都是持续的填充着同一个文件,如果系统确认这个文件需要改写或者删除,整个块都可以被标记为无效(需要Trim支持),自然就不需要之后的GC操作了。(读取整个块并写入新的块)这个块只需要擦除,比读,改,写更快速有效.•Randomwrites随机写入一个SSD主控的随机写入最高速度一般发生在安全擦除后,完全GC,全盘Trim,或新安装的状态下。而随机写入的能力取决于主控制器的1.通道数。2.固件效率。3.闪存颗粒写入页面的性能。然后就是写入放大的多少,越接近于1越好,小于1更那好。当全盘颗粒都被写过后,GC功能就将被启用,速度就会受到影响,之后的写入放大就会达到SSD主控制器的最大倍数。大量的随机小文件的写入是“闪存杀手”•可用空间SSD控制器会使用所有的可用空间做垃圾回收和磨损均衡。保证一定的可用空间可以提升SSD效率,减少写入放大。(前提是支持Trim)总结•写入放大是关键的SSD指标,闪存的写入速度比读取速度慢的多,所以现在的SSD主控制器用多通道来提升写入速度.如果写入放大太高,意味着一样的操作需要写入更多的数据,这样速度自然快不起来。一个主控的好坏主要体现在写入放大上.如果大家都一样的通道数,颗粒也相同,但差别为什么会那么大.原因就是一个写的少而另个写的多。一切算法技术的根本目标是要尽可能的减少写入放大。