NANDFLASH均衡算法笔记

NANDFLASH均衡算法笔记
转来⼀篇关于NAND FLASH均衡算法的⽂章,加上⼀点思考和笔记,认为这种思考有助于更深刻的理解,更好的记忆,所以也算半原创了吧,最起码笔记是原创的。有意思的是,帖⼦提起这个算法并不是因为嵌⼊式开发的需要,⽽是企业存储。因为提到硬盘驱动器HDD的速度硬伤,⽬前估计就SSD⼀种好的存储介质解决⽅案吧,⽽SSD除了暂时价格⼩⾼以外,主要有⼀个寿命短的硬伤。这样的话就不可避免的涉及到映射、磨损均衡、存储格式转换等优化问题。以前⼀直认为基本只有使⽤NAND FLASH代替HDD的嵌⼊式平台才产⽣这种需求。原来FTL这东西除了嵌⼊式要⽤,还有企业数据存储⽅⾯的重要价值,今天可算到特例了。我们⽼听⽼说固态硬盘,甚⾄新电脑也⽤上了SSD,但是从没对SSD这个熟悉的陌⽣⼈有这样的认识(以后还可能更深刻)。
《1G卖1百美元均衡算法解⾼价SSD寿命难题》
300万美元!
这是经典的TPC测试的平均硬件成本,虽然TPC组织制订了新的测试规范TPC-C,平均成本⼤幅度下降,但是每次TPC测试动⽤的硬件仍然是⼀个巨⼤的开⽀。其实不论是TPC、SAP-SD还是SPEC的测试,测试硬件环境开⽀最⼤的仍然是存储系统。
在多数企业级基准测试中,数据库操作往往是测试的核⼼。为了让服务器CPU能够达到接近100%的利⽤率,测试中往往动⽤价格⾼昂的存储系统与之匹配。在企业的实际应⽤中,服务器CPU的利⽤率通常在10%以下,因为CPU性能的提升速度远远快于存储系统提升的速度。⼀般⽽⾔,服务器CPU的吞吐与内存的吞吐再到存储系统的吞吐中存在数量级的差异,尤其是在⼤型并⾏计算系统中,多个CPU核⼼的并发吞吐远远超过存储的性能上限。
不论是价格昂贵的全光纤通道存储系统,还是新近热销的1万5千转的SAS磁盘系统,磁盘机构的机械性能永远都是⼀个不可逾越的障碍。在价格不菲的测试存储系统中,经常可以看到⼏⼗个甚⾄⼏百个⼩磁盘组成的阵列并⾏⼯作。这类系统是不可能在市场上销售的。即便如此,⼤型电⼦商务带来的存储压⼒还是⽆法化解。
SSD的出现给存储系统性能的升级带来曙光。SSD节能和读取存储速度的优势深受企业级⽤户的关注。⾄于⽬前SSD⾼昂的价格,反倒不是⽤户最担⼼的问题。因为SSD完全采⽤半导体⼯艺,同样遵循摩尔定律。看看消费市场U盘价格瀑布式的下滑曲线就明⽩。但是SSD的寿命就成为所有⽤户最担⼼的问题。数据安全事关企业的⽣死,在公共领域甚⾄事关社会稳定!企业⽤户选择存储的时候,永远需要在速度、容量和安全⽅⾯做出妥善的平衡。⼀般SSD10万⼩时的寿命显然是企业⽤户⽆法接受的。
  从性能上看,SSD优势明显。下⾯这张图是三星公布的其50G固态硬盘在性能与价格上与SAS及SCSI硬盘的⽐较。从图上来看,这款SSD在IOPS、读写速度等参数上明显优于机械硬盘。当然其价格也是更⼤容量的机械硬盘的1.5倍。
三星SSD与机械硬盘的对⽐
  在企业级市场上,更⾼性能的SSD⽐⽐皆是,⽽这些产品的价格也⾼到令⼈乍⾆,从下⾯⼀张SSD与HDD的⽐较列表我们不难看出这⼀点。⼀⽅⾯其数万的IOPS是⾼速数据读写最为渴望的参数,但另⼀⽅⾯其数万美元的售价也是传统硬盘的数⼗倍。
四款SSD与希捷15K SAS硬盘的⽐较
  由于SSD采⽤的是NAND Flash作为存储介质,⽽NAND Flash虽然不像DRAM内存颗粒那样依赖供电,但其同样不像DRAM内存颗粒⼀样拥有⽆限的寿命。就⽬前来说,NAND的写⼊寿命只有10万个循环。⼀旦某个存储单元的写⼊循环接近这个数字,就可能会遭遇到彻底的物理损坏。
/*
*终于“啰嗦”完了,开始进⼊正题,说技术细节了。
*不太明⽩,某⼀个存储单元坏了就彻底跳过去么?不⾏?坏⼀个全都坏?
智能蓝牙遥控器*还是说所谓的这个“跳过去”,已经是需要额外的算法了,估计是!⼀个NAND FLASH⾃⼰能⼲什么?!(不过是不是也有硬件内部编程的)
*/
  ⽽对于需要频繁读写的硬盘来说,10万个循环显然是⽆法与传统硬盘相抗衡。因此,如果寿命问题⽆法得到⼀个妥善的解决⽅案,那么SSD的市场推⼴进程将会受到极⼤的阻碍。
SSD闪存单元耐⽤性
  可能看到这⾥有的朋友会说,既然只能写⼊10万次,那对于读写频繁的企业应⽤来说,怎么可能将任务交给如此不可靠的设备呢?这样的问题在SSD推⼴之初确实被多次提及,也成为了SSD推⼴的障碍,写⼊速度有限的先天缺陷并不是没有办法弥补,现在不少的⼚商推出的新的产品已经可以⽆故障运⾏200万⼩时以上,⽽这正得益于良好的读写分配策略。
  为了有效避免对SSD硬盘某⼀区块的频繁读写造成该区块的⽼化加速,SSD驱动器制造商已经研发出⼀系列的算法来平均分配读写区块的位置,⽽其中最有效的就要数我们今天要为⼤家介绍的Wear-Leveling算法。
Wear-Leveling算法
卧式炭化炉
  众所周知,SSD的寿命局限于它的读写次数。对相同的存储单元不断地进⾏编写和擦除将更容易导致该存储单元受到永久性的损害。为了避免该情况的发⽣,有⼀种叫“Wear-Leveling”的特殊的算法被配置到SSD中。该算法的中⽂译名为均衡磨损。顾名思义,Wear-Leveling 就是将擦除/写⼊循环平均地分配到SSD的所有存储单元中。这样就避免了对同⼀个存储单元持续不断地进⾏擦除/写⼊操作,从⽽有效地延长了SSD的寿命。
SSD硬盘逻辑布局
1.存储布局
  为了更好地理解Wear-Leveling在SSD中的⼯作原理,有必要先简要地了解⼀下NAND Flash的结构布局。⼀个SSD是由很多个独⽴的NAND Flash芯⽚组成的。每个NAND Flash则由⼀个块阵列组成。每⼀个块就是⼀系列的名为页(page)的存储单元的集合。
简单的NAND Flash存储布局
  在将数据写⼊NAND Flash的存储单元之前,必须对该存储单元进⾏擦除,以便可以进⾏写⼊。最⼩的擦除单元是block(块),最⼩的写⼊或者读取单元是page(页)。
2.块配置
块的两种不同类型
  针对Wear-Leveling算法,SSD中块单元可以分成两种类型:数据块和空闲块。数据块是闪存的主要部分,并且受到Wear-Leveling算法和数据存储器的影响。空闲块的数⽬在整个闪存中占百分之⼆,主要⽤于缓冲Wear-Leveling算法。这就意味着闪存中块会根据Wear-Leveling准则在数据块池和空闲块池相互转换。
/*
*这马上就让我想到⼀个问题,这个空闲池岂不是要频繁擦写?莫⾮连这个空闲池也要经常换地⽅?
*抑或是我想的太单纯了,这⾥的FREE BLOCKS并不是⼀个确定的区域,⽽是⼀种逻辑上的说法?且看下⽂
*/
3.闪存转换层(Flash Translation Layer,即FTL)管理
  FTL提供对逻辑地址到物理地址映射的管理,同时对闪存和⽆效块映射进⾏擦除计数管理。每个块的擦除次数都会被记录在⼀个叫做擦除计数表(ECT)的表格中。当块进⾏⼀次擦除时,ECT都会将该块的擦除次数⾃动加⼀。
  Wear-Leveling会浏览该计数表,以此来决定哪些块必须从数据块池转移到空闲块池,或者相反。当需要转换操作时,转换表会把逻辑块地址重新分配给物理块地址,同时在新的块组中重新组合块地址和擦除计数值。下图是ECT的⼀个简单的块管理⽰意图和转换映射表。/*
*果然提到了,空闲池块果然是不断变化的,不过磨损是怎么算的?
*存储数据的算磨损空闲块就不算磨损了?那空闲块作为缓冲不是⼀直擦写么?
*或者是空闲块池不做缓冲?我记错了?空闲块只是⼀个养⽼院?!
*前⽂“对相同的存储单元不断地进⾏编写和擦除将更容易导致该存储单元受到永久性的损害。”
*/
擦除计数表(ECT)和与之相关的转化映射表
  值得注意的是,在典型操作情况下,ECT和转换映射表是在SRAM(静态随机存储器)中进⾏管理操作的。然⽽,SRAM是⼀个⾮永久性存储器,所以映射表必须在NAND Flash中进⾏。SSD通上电源时,SRAM就会得到原本存储于NAND Flash上的映射表,并在周期性时期段内或者断电时,重新再NAND Flash进⾏备份。
/*
*⼜涉及到了易失与⾮易存储器失以及把哪个表放在哪的问题。
*好像明⽩了,所谓逻辑上给出的那个Free Blocks,完全就是修改映射表,所谓在SSD上操作的,就是通电读取和周期性或者在断电时存⼊~!
*较真的话:我还想问,周期性的存这个表,不也是对存放表格的SSD部分的磨损么??飞机加油车
*还有断电时候怎么进⾏备份,能残存⼀股电流神马的?
*/
4.动态Wear-Leveling
  Wear-Leveling有两种类型:动态和静态。动态Wear-Leveling算法保证数据的编写和循环的擦除会被均匀地分布到NAND Flash的所有块中。该算法之所以是动态的是因为它每次都在缓冲区处理数据,然后写⼊闪存中。就像前⾯提到的那样,该算法主要是为了避免让应⽤程序重复不断地对同⼀个存储区域进⾏擦除/写⼊,从⽽让该存储单元出现永久性损坏。
  当出现⼀个写数据请求时,动态Wear-Leveling就会开始启动。该算法先对ECT的空闲块池进⾏浏览,寻⼀个擦除计数值最⼩的块单元。⼀旦到符合要求的块,就将数据写⼊,并将该块送⼊数据块池。然后将新块的物理地址与主机发送过来的逻辑地址在转换映射表上建⽴彼此的映射关系。
  通过这种做法,即使重复地对同⼀个逻辑地址进⾏写数据,由于逻辑地址和物理地址之间的映射关系发⽣了变化,所以数据⾃然不会在同⼀个物理块上进⾏重复写⼊。数据写⼊后,就需要将与主机写⼊的逻辑地址最初相映射的物理数据块进⾏擦除,然后更新ECT块擦除计数值,并将块送⼊空闲块池,修改ECT中的块组信息。
5.静态Wear-Leveling
  单单使⽤动态Wear-Leveling⽆法保证所有块能够在相同的概率下使⽤Wear-Leveling。对于有些特殊
的情况⽐如数据写⼊闪存并存储了相当长⼀段时间甚⾄⽆限期的情况,动态Wear-Leveling就⽆法起作⽤。当其他块频繁地进⾏交换,擦除和存储,上述这些块单元在Wear-Leveling操作中却始终保持不活动状态。
/*
*动态只能对付需要写⼊块单元的,⽽对早已写⼊的“钉⼦户”⽆可奈何。
*
*/
  为了确保所有块都能够受到Wear-Leveling算法的检测,第⼆种Wear-Leveling算法——静态Wear-Leveling就应运⽽⽣了。静态Wear-Leveling会对那些处于不活动状态的块单元进⾏寻址,并把数据写⼊它们之中。静态Wear-Leveling使⽤两个触发机制定期地进⾏操作。
/*
*“不活动状态”怎么解释?是说没写⼊的么?长期没写⼊应该会被“最⼩擦出次数”机制捕捉到!
*如此,只能解释为写⼊数据就没动地⽅的“钉⼦户”,这样的话,岂不是要覆写原来的数据?!
*上边这段⽂字⽋解释,或者说的太笼统,看下边怎么说吧
*/
  第⼀个触发机制是检测不活动块单元的闲置存储阶段。如果这个闲置阶段超过了所设定的上限,就会启动ECT进⾏浏览操作,寻在数据块池中擦除计数值最⼩的块单元,以及空闲块池中擦除计数值最⼤的块单元。
包边角钢
静态Wear-Leveling块⽰意图
探头板
  ⼀旦该查完成,第⼆个触发机制就会将数据块池中最⼩的擦除计数值与空闲块池中最⼤的计数值进⾏相减,如果结果超过了设定上限,那么在数据块池中擦除计数值最⼩的块单元的数据就会被转移到空闲块池中擦除计数值最⼤的块单元中。
/*
*这个算法的主要思路就是想办法把“钉⼦户”放到“养⽼院”Free Blocks池,再让“养⽼院”想办法把他们送回去⼯作。
*那空闲块池中原来那个擦除计数值最⼤的块单元呢?应该是优先送擦出次数⼩的出去继续⼯作吧?
*/
  然后,这两个块的位置也要互换。数据块池中擦除计数值最⼩的块就会被擦除,并放置到空闲块池中。⽽原先在空闲块池中计数值最⼤的块则由于已经被写⼊了其他块的内容,⽽被转移到数据块池中。转换完成后,在FTL中转换映射表就要进⾏更新,将逻辑块地址映射到新的物理块地址上。最后,ECT会对每⼀个块重新组队。
/*
*果然是这个意思,不过为什么呢?为什么把计数值最⼤的块送出去继续写⼊数据?
锌合金压铸模具*意思是我刚才的思路还不是正解正解是,钉⼦户先被送⼊养⽼院,再⽴马回去⼯作,
*通过这么⼀通折腾,让它变活跃了,下⼀次就可以正常来管理了。
*但是这也有前提吧,就是触发条件,如果⽆限制触发静态平衡,那擦除次数⾼的块⽼是送回去继续写⼊,有违磨损管理的初衷。
*“第⼀个触发机制是检测不活动块单元的闲置存储阶段。如果这个闲置阶段超过了所设定的上限”
*如此看来,也是对钉⼦户容忍到⼀定程度,超过了设定阀值,不得不管的时候才触发的静态Wear-Leveling。
*/
6.⽆效块处理和映射
  ⽆效块包含⼀些⽆效内容,导致SSD的稳定性⽆法得到保证。在制造过程或者运⾏时,难免会产⽣⼀些损坏的块单元。当SSD第⼀次启动时,驱动器就会浏览每个块单元,在FTL的⽆效块列表中(IBT)出那些由SSD卖主事先标记好的⽆效块。

本文发布于:2024-09-23 04:27:23,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/270532.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   块池   擦除   空闲   算法   映射   测试   转换
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议