Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1263125
  • 博文数量: 185
  • 博客积分: 495
  • 博客等级: 下士
  • 技术积分: 1418
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-02 15:12
个人简介

治肾虚不含糖,专注内核性能优化二十年。 https://github.com/KnightKu

文章分类

全部博文(185)

文章存档

2019年(1)

2018年(12)

2017年(5)

2016年(23)

2015年(1)

2014年(22)

2013年(82)

2012年(39)

分类: LINUX

2016-10-10 11:04:28

转自:http://blog.csdn.net/huqinwei987/article/details/17046093

转来一篇关于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倍。

1G卖1百美元均衡算法解高价SSD寿命难题
三星SSD与机械硬盘的对比

  在企业级市场上,更高性能的SSD比比皆是,而这些产品的价格也高到令人乍舌,从下面一张SSD与HDD的比较列表我们不难看出这一点。一方面其数万的IOPS是高速数据读写最为渴望的参数,但另一方面其数万美元的售价也是传统硬盘的数十倍。

1G卖1百美元均衡算法解高价SSD寿命难题
四款SSD与希捷15K SAS硬盘的比较

  由于SSD采用的是NAND Flash作为存储介质,而NAND Flash虽然不像DRAM内存颗粒那样依赖供电,但其同样不像DRAM内存颗粒一样拥有无限的寿命。就目前来说,NAND的写入寿命只有10万个循环。 一旦某个存储单元的写入循环接近这个数字,就可能会遭遇到彻底的物理损坏。
/*
*终于“啰嗦”完了,开始进入正题,说技术细节了。

*不太明白,某一个存储单元坏了就彻底跳过去么?不行?坏一个全都坏?
*还是说所谓的这个“跳过去”,已经是需要额外的算法了,估计是!一个NAND FLASH自己能干什么?!(不过是不是也有硬件内部编程的
*/

  而对于需要频繁读写的硬盘来说,10万个循环显然是无法与传统硬盘相抗衡。因此,如果寿命问题无法得到一个妥善的解决方案,那么SSD的市场推广进程将会受到极大的阻碍。

1G卖1百美元均衡算法解高价SSD寿命难题
SSD闪存单元耐用性

  可能看到这里有的朋友会说,既然只能写入10万次,那对于读写频繁的企业应用来说,怎么可能将任务交给如此不可靠的设备呢?这样的问题在SSD推广之 初确实被多次提及,也成为了SSD推广的障碍,写入速度有限的先天缺陷并不是没有办法弥补,现在不少的厂商推出的新的产品已经可以无故障运行200万小时 以上,而这正得益于良好的读写分配策略。

  为了有效避免对SSD硬盘某一区块的频繁读写造成该区块的老化加速,SSD驱动器制造商已经研发出一系列的算法来平均分配读写区块的位置,而其中最有效的就要数我们今天要为大家介绍的Wear-Leveling算法。


Wear-Leveling算法

  众所周知,SSD的寿命局限于它的读写次数。对相同的存储单元不断地进行编写和擦除将更容易导致该存储单元受到永久性的损害。为了避免该情况的发生, 有一种叫“Wear-Leveling”的特殊的算法被配置到SSD中。该算法的中文译名为均衡磨损。顾名思义,Wear-Leveling就是将擦除/ 写入循环平均地分配到SSD的所有存储单元中。这样就避免了对同一个存储单元持续不断地进行擦除/写入操作,从而有效地延长了SSD的寿命。

1G卖1百美元均衡算法解高价SSD寿命难题
SSD硬盘逻辑布局

1.存储布局

  为了更好地理解Wear-Leveling在SSD中的工作原理,有必要先简要地了解一下NAND Flash的结构布局。一个SSD是由很多个独立的NAND Flash芯片组成的。每个NAND Flash则由一个块阵列组成。每一个块就是一系列的名为页(page)的存储单元的集合。

1G卖1百美元均衡算法解高价SSD寿命难题
简单的NAND Flash存储布局

  在将数据写入NAND Flash的存储单元之前,必须对该存储单元进行擦除,以便可以进行写入。最小的擦除单元是block(块),最小的写入或者读取单元是page(页)。

2.块配置

1G卖1百美元均衡算法解高价SSD寿命难题
块的两种不同类型

  针对Wear-Leveling算法,SSD中块单元可以分成两种类型:数据块和空闲块。数据块是闪存的主要部分,并且受到Wear- Leveling算法和数据存储器的影响。空闲块的数目在整个闪存中占百分之二,主要用于缓冲Wear-Leveling算法。这就意味着闪存中块会根据 Wear-Leveling准则在数据块池和空闲块池相互转换。
/*
*这马上就让我想到一个问题,这个空闲池岂不是要频繁擦写?莫非连这个空闲池也要经常换地方?
*抑或是我想的太单纯了,这里的FREE BLOCKS并不是一个确定的区域,而是一种逻辑上的说法?且看下文
*/

3.闪存转换层(Flash Translation Layer,即FTL)管理

  FTL提供对逻辑地址到物理地址映射的管理,同时对闪存和无效块映射进行擦除计数管理。每个块的擦除次数都会被记录在一个叫做擦除计数表(ECT)的表格中。当块进行一次擦除时,ECT都会将该块的擦除次数自动加一。

  Wear-Leveling会浏览该计数表,以此来决定哪些块必须从数据块池转移到空闲块池,或者相反。当需要转换操作时,转换表会把逻辑块地址重新分配给物理块地址,同时在新的块组中重新组合块地址和擦除计数值。下图是ECT的一个简单的块管理示意图和转换映射表。
/*
*果然提到了,空闲池块果然是不断变化的,不过磨损是怎么算的?
*存储数据的算磨损空闲块就不算磨损了?
那空闲块作为缓冲不是一直擦写么?
*或者是空闲块池不做缓冲?我记错了?空闲块只是一个养老院?!
*前文“对相同的存储单元不断地进行编写和擦除将更容易导致该存储单元受到永久性的损害。”

*/

1G卖1百美元均衡算法解高价SSD寿命难题
擦除计数表(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进行浏览操作,寻找在数据块池中擦除计数值最小的块单元,以及空闲块池中擦除计数值最大的块单元

1G卖1百美元均衡算法解高价SSD寿命难题
静态Wear-Leveling块示意图

  一旦该查找完成,第二个触发机制就会将数据块池中最小的擦除计数值与空闲块池中最大的计数值进行相减,如果结果超过了设定上限,那么在数据块池中擦除计数值最小的块单元的数据就会被转移到空闲块池中擦除计数值最大的块单元中
/*
*这个算法的主要思路就是想办法把“钉子户”放到“养老院”Free Blocks池,再让“养老院”想办法把他们送回去工作。
*那空闲块池中原来那个擦除计数值最大的块单元呢?应该是优先送擦出次数小的出去继续工作吧?
*/

  然后,这两个块的位置也要互换。数据块池中擦除计数值最小的块就会被擦除,并放置到空闲块池中。而原先在空闲块池中计数值最大的块则由于已经被写入了 其他块的内容,而被转移到数据块池中。转换完成后,在FTL中转换映射表就要进行更新,将逻辑块地址映射到新的物理块地址上。最后,ECT会对每一个块重 新组队。
/*
*果然是这个意思,不过为什么呢?为什么把计数值最大的块送出去继续写入数据?
*意思是我刚才的思路还不是正解!!!正解是,钉子户先被送入养老院,再立马回去工作,
*通过这么一通折腾,让它变活跃了,下一次就可以正常来管理了。
*但是这也有前提吧,就是触发条件,如果无限制触发静态平衡,那擦除次数高的块老是送回去继续写入,有违磨损管理的初衷。
*
第一个触发机制是检测不活动块单元的闲置存储阶段。如果这个闲置阶段超过了所设定的上限
*如此看来,也是对钉子户容忍到一定程度,超过了设定阀值,不得不管的时候才触发的静态Wear-Leveling。
*/


6.无效块处理和映射

  无效块包含一些无效内容,导致SSD的稳定性无法得到保证。在制造过程或者运行时,难免会产生一些损坏的块单元。当SSD第一次启动时,驱动器就会浏览每个块单元,在FTL的无效块列表中(IBT)找出那些由SSD卖主事先标记好的无效块。

1G卖1百美元均衡算法解高价SSD寿命难题
静态Wear-Leveling块示意图

  在运行过程中,擦除编写也会出现错误。它们会被NAND Flash芯片中的监测状态寄存器检测出来。如果错误出现,状态寄存器中指定的比特位就会被重设,以此来表示该块已经不再稳定,必须被标示为无效。当一个损坏的块被检测出来时,FTL会将该块上的数据重新写入到空闲块池中擦除计数值最小的块中,并将该逻辑地址重新映射到新的物理地址上。被检测到出现错误的块会在IBT中被标示,并从空闲块池中删除。

  当无效块的数量增加时,伴随而来的是可用闪存的减少,空闲块中的可用块也会随着减少。而上述方法相较于其他将无效块替换的算法来说,能够有效地提高闪存的使用率。因为那些替换算法是使用那些保留未使用的块单元来替换无效块的。
/*
*核心部分结束,下边blabla
*/

总结:

  显然,影响SSD使用寿命的因素很多,包括SSD擦除与写入数据的策略、SSD的电气性能甚至是SSD使用环境温度等等,而在其中,数据写入的均衡性算法无疑是最为重要的延长SSD使用寿命的方法之一,好的写入均衡性算法可以使数据平均地分布在整个驱动器的block里,而不会造成某一区块成为信息读写的热点从而影响到整个SSD的寿命

  而我们今天为大家介绍的Wear-Leveling算法就是目前存储驱动器厂商普遍使用的方法之一,通过使用合适的写入均衡算法以及指定合适的擦除写 入策略,目前的企业级SSD产品已经可以达到无故障运行200万小时的强度,这样的品质已经足以保证硬盘使用20年以上。

  现在的SSD已经有了完善的预警功能,在寿命将要到期前会对用户进行提示,相信这样的质量已经足以满足大多数企业级存储的要求了,而相信随着技术的进步,更加完善的均衡算法与擦除写入策略的开发一定能使SSD的使用寿命更进一步。

  而在寿命问题初步解决之后,产品售价问题就变得更加迫在眉睫,毕竟即使是较为便宜的企业级SSD产品每GB的价格也比机械硬盘高出数倍,而高性能SSD的价格与机械硬盘相比就更是高出了上百倍,这样的差价对于任何想要普及的事物都会是无法逾越的障碍。

  不过,在这之中我们也能够找到令人欣喜的消息存在,那就是虽然现在SSD价格仍然高高在上,不过却是以一个非常快的速度在下降,现在SSD的每GB价 格与两年前相比已经下降了超过50%,这足以令我们对未来充满期待,相信在不久的将来,会有寿命和价格都令人满意的SSD产品出现。

        转载地址:http://blog.csdn.net/huqinwei987/article/details/17046093
阅读(2127) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~