IT技术博客大学习 共学习 共进步

SSD的主要缺陷及Wear Leveling技术详解

光头老蒋 2011-02-11 23:02:32 浏览 10,024 次

读写次数有限

SSD最大的缺陷在于读写次数有限,SSD分为两种;快闪存储器的多层式储存单元(Multi-Level Cell,MLC)要比单层式储存单元(Single-Level Cell,SLC)更有价格优势,也比较有取代传统硬碟的架势。虽然在抹除(写入)次数上,MLC号称一万次,SLC号称十万次,但根据老蒋取得的统计数据显示,实测过后,MLC只有三千次,SLC则只到三万次。

这样的寿命用在一般消费电子、数码相机、USB随身碟都没什么问题。但若要做为计算机的系统碟,不论是产品可靠度或是资料完整度,都不可能满足计算机系统的需求。

包括Intel在内的快闪存储器及固态硬碟控制器厂商,都透过Wear Leveling技术,让固态硬碟机的各个存储器单元抹除次数尽可能平均。加上错误更正码(Error Correction Code,ECC)来提高产品可靠度。

但老蒋认为,目前的技术无法「有效」解决固态硬碟机的抹除次数限制。

目前小笔电的固态硬碟几乎清一色使用MLC架构,企业运算环境则多采用SLC架构。这样的差异来自市场特性、价格及资料完整度、产品可靠度的要求。SLC更稳定,价格也高更多。

商用必须谨慎导入

至于企业运算应用环境的使用经验上,包括Sun Microsystems、EMC甚至Google等大厂,虽然都宣称要拥抱固态硬碟,但目前都只是测试阶段,还没正式导入。

比起个人市场,企业用户需要更长的时间,来评估产品是否可以导入。而且企业运算环境比个人运算的负荷要高出很多。

如果固态硬碟无法在三年提升稳定性,免除使用者不愉快的经验。以后就要要花数倍的努力,才能让人重新接受它。毕竟传统硬碟是个发展超过50年的成熟科技。

价格还是太高

很多业界朋友认为,当固态硬碟每GB售价低于0.5美元时,一般使用者就会接受固态硬碟代替传统磁碟机。这样的预测在商用计算机市场也许可以成立,不过,对于成本非常敏感的消费计算机市场,却不容易实现。虽然目前使用者不需要那么大的容量,但实际的购买行为却不是如此。

64GB的固态硬碟绝对无法满足一般使用者。如何把价格尽快降到大众可接受的范围,又要维持产业本身的健康发展,对厂商的挑战绝对不下于前面提到的两个问题。

使用传统硬碟的机种几乎称霸整个迷你笔电市场,仅华硕部分机型用固态硬碟,且容量都不大。

传统硬碟的一些谬论

虽然传统硬碟机给大家许多刻板印象:比固态硬碟机耗电、抗冲击及抗震能力不如固态硬碟、运转噪音大。当人们对于固态硬碟的激情过后,我们仔细来看,在笔记型计算机系统中,硬碟机的耗电只占总耗电的10~15%。这代表硬碟对电池使用时间的影响不超过20分钟。

在产品回修率及资料可靠度上,传统旋转式硬碟机也是比固态硬碟机为佳。万一硬碟机故障,又无事先备份资料,在资料救援难度上,固态硬碟的资料几乎完蛋。但只要碟片没被完全刮坏,储存在传统硬碟机的资料几乎都可以恢复。

在一台完整的计算机系统中,用来显示画面的耗电量最大,传统硬碟的耗电量大约在15%左右。(资料来源:Intel)

SLC与MLC一个稳定、安全却贵到翻;另一个便宜、容量大却令人不安。看样子只有云存储的分布式存储系统能解决MLC不稳定的问题。

MLC只有三千次,SLC则只到三万次读取。这在企业级存储上几乎是不能用的,但是wear-leveling的技术让SSD的数据存储寿命增加了很多,简单说wear-leveling就是让系统平均的读写SSD中每一个数据块。

动态Wear-Leveling

  Wear-Leveling有两种类型:动态和静态。动态Wear-Leveling算法保证数据的编写和循环的擦除会被均匀地分布到NAND Flash的所有块中。该算法之所以是动态的是因为它每次都在缓冲区处理数据,然后写入闪存中。就像前面提到的那样,该算法主要是为了避免让应用程序重复不断地对同一个存储区域进行擦除/写入,从而让该存储单元出现永久性损坏。

  当出现一个写数据请求时,动态Wear-Leveling就会开始启动。该算法先对ECT的空闲块池进行浏览,寻找一个擦除计数值最小的块单元。一旦找到符合要求的块,就将数据写入,并将该块送入数据块池。然后将新块的物理地址与主机发送过来的逻辑地址在转换映射表上建立彼此的映射关系。

  通过这种做法,即使重复地对同一个逻辑地址进行写数据,由于逻辑地址和物理地址之间的映射关系发生了变化,所以数据自然不会在同一个物理块上进行重复写入。数据写入后,就需要将与主机写入的逻辑地址最初相映射的物理数据块进行擦除,然后更新ECT块擦除计数值,并将块送入空闲块池,修改ECT中的块组信息。

静态Wear-Leveling

  单单使用动态Wear-Leveling无法保证所有块能够在相同的概率下使用Wear-Leveling。对于有些特殊的情况比如数据写入闪存并存储了相当长一段时间甚至无限期的情况,动态Wear-Leveling就无法起作用。当其他块频繁地进行交换,擦除和存储,上述这些块单元在Wear-Leveling操作中却始终保持不活动状态。

  为了确保所有块都能够受到Wear-Leveling算法的检测,第二种Wear-Leveling算法――静态Wear-Leveling就应运而生了。静态Wear-Leveling会对那些处于不活动状态的块单元进行寻址,并把数据写入它们之中。静态Wear-Leveling使用两个触发机制定期地进行操作。

  第一个触发机制是检测不活动块单元的闲置存储阶段。如果这个闲置阶段超过了所设定的上限,就会启动ECT进行浏览操作,寻找在数据块池中擦除计数值最小的块单元,以及空闲块池中擦除计数值最大的块单元。

  一旦该查找完成,第二个触发机制就会将数据块池中最小的擦除计数值与空闲块池中最大的计数值进行相减,如果结果超过了设定上限,那么在数据块池中擦除计数值最小的块单元的数据就会被转移到空闲块池中擦除计数值最大的块单元中。

  然后,这两个块的位置也要互换。数据块池中擦除计数值最小的块就会被擦除,并放置到空闲块池中。而原先在空闲块池中计数值最大的块则由于已经被写入了其他块的内容,而被转移到数据块池中。转换完成后,在FTL中转换映射表就要进行更新,将逻辑块地址映射到新的物理块地址上。最后,ECT会对每一个块重新组队。
 
6.无效块处理和映射

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


静态Wear-Leveling块示意图

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

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

总结:

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

建议继续学习

  1. 我对技术方向的一些反思 (阅读 11,144)
  2. 基于SSD的数据库性能优化 (阅读 8,664)
  3. SSD 寿命的检查和健康判断 (阅读 7,162)
  4. SSD磨损数据的分析报告 (阅读 5,021)
  5. Linux 中对 SSD 的优化 Discard,类 TRIM 的功能 (阅读 4,981)
  6. SSD的随机写一定很慢吗? (阅读 4,184)
  7. Android Wear设计指南 (阅读 3,602)
  8. SSD 想说爱你不容易 (阅读 3,382)
  9. 不同SSD盘组合搜索引擎单机性能测试[2013年版] (阅读 3,182)
  10. 数据的存储介质-固态存储SSD (阅读 2,824)