存储 频道

SSD固态硬盘2012终极横评及选购指南

  闪存的损耗平衡与过量配置

  在前面我们提到,NAND 闪存采用了浮栅存放电子的方式来保存信息,电子进出浮栅的方式为量子学中的隧穿效应,隧穿的时候,电子会被浮栅和衬底之间的隧穿氧化层捕获,随着陷落于氧化层中的电子增多,闪存单元将会因此失效。

  不过氧化层内的电子其实并非一定会永远都陷落其中,随着温度的提升,氧化层中的一部分电子将有机会逃逸(挤?)出来,使得闪存单元获得重生,这样的情况被称作自愈。

  在 Flash Memory Summit 2011 上来自纽约伦斯勒理工学院张同的一个幻灯片,提出了和闪存管芯叠加一个专门的加热管芯,能够以 1.5~5.1 瓦的耗电将芯片的温度提升至 110~250 摄氏度,当将温度加至 200 摄氏度(过高的温度可能导致芯片变形)保持大约 35 分钟(还得加上冷却时需要加热时间的 3 倍),在保守估计能将 80% 的界面陷阱恢复的情况下,能实现将闪存放闪周期从 3,000 次提升到 17,400 次。

  不过在类似疯狂想法真正在产品实现之前,现在的 SSD 都采用了一些技术来确保存储单元的耐用度不至于被过快消耗掉,例如损耗平衡(Wear Leveling)就能够透过将写入操作尽可能地平均分布于闪存各个存储块,使得芯片各处的放闪次数趋于一致,从而“延长”SSD 的使用寿命。

  损耗平衡的做法有动态和静态两种。

  动态损耗平衡就是依据物理地址映射表中存放的放闪次数,决定将数据存放到较少放闪次数的存储块中,对于不是执行数据更新的存储块或者说静态数据存储块则不会被动态损耗平衡盯上,例如一个存放有 50GB mp3 音乐等静态数据的 120GB SSD 可以有 70 GB 的空间用于动态损耗平衡。

  静态损耗平衡会对所有的存储块执行损耗平衡,包括那些没有需要数据更新的存储块,这样的好处是可以用于损耗平衡的存储块数将可能更多,减少存放静态数据(例如 mp3)存储块和存放动态数据(例如日志文件)存储块之间的不平均损耗问题,增加(维持?)整个 SSD 的耐久度。

  损耗平衡的概念其实并不复杂,但是需要 SSD 厂商在算法上尽量地减少执行损耗平衡所带来的性能损失,例如采用专门的 DRAM 内存作为缓存等。

  提升耐用度的另一个办法是采用过量配置(Over-Provisioning),损耗平衡的概念是需要尽量地将闪存的擦除平均地分布于 SSD 的各个闪存角落,容量愈大,同样擦除量所产生的平均放闪周期自然越少,不过如果还是出现了存储块失效的情况,就需要将该存储块标记为不可用,然后从 SSD 预留的冗余区中重新分配一块存储块到相应的逻辑地址,这个冗余区就是过量配置的空间。

  过量配置当然不是免费的,根据 SSD 本身等级、销售目标市场的不同,过量配置的空间也不尽相同,一般来说企业级的 SSD 会分配 20% 的过量配置,而桌面级的是 6% 左右,用户自己也可以使用 ATA 指令来调整 LBA 空间大小从而改变过量配置大小,牺牲更多的可用空间来换取耐久度。

  Garbage Collection 和 Trim

  前面我们已经说过,NAND 闪存不能直接对一个已经写入了数据的 Page 马上进行重写,它必须等待到这个 Page 所在的 Block 被擦除后才能进行,而且每次擦除都是一整个 Block 而不只是单独的某个 Page。

  为了对闪存中的数据重新放置、删除掉陈旧数据并腾出空白 Block 来存放新数据,NAND 闪存需要执行被称作 Garbage Collection(或者 Merges,合并)的操作,而 SSD 的损耗平衡操作也主要在这个时候执行。

  见下图中“情形三”的介绍:

损耗均衡、垃圾回收、TRIM

  在 Windows XP 中,删除文件的时候操作系统会把对应的逻辑空间标记为已经删除,但是 SSD 并不会知道有这么一回事。

损耗均衡、垃圾回收、TRIM

  在写入新数据的时候,操作系统有可能向之前逻辑表中用过但是标记为已删除的空间写入数据,只有在这时,SSD 才能透过操作系统向它发出的逻辑地址知道原本这个地址对应的数据是被删除不再有用了的。

损耗均衡、垃圾回收、TRIM

  而在 Windows 7(以及 Windows Server R2、Linux 2.6.33、FreeBSD 8.2、OpenSolaris、Mac OS X Lion)中引入了 Trim 指令的支持(见上图),会在删除了文件的同时向 SSD 发出 Trim 指令,让 SSD 可以在自身的逻辑地址表中也将对应的文件标记为已删除,如此一来就能避免 GC 的时候把无效数据也读取、复制到其他存储块,让 SSD 知道增加了空白空间。

  Trim 不能在 RIAD 的时候使用,在这个时候就得依赖 ITGC(idle-time Garbage Collection,闲置时废物回收,又被称作后台 GC(BGC))。

  前面所说的标准 GC 过程是系统要写入新数据的之前,需要先读取出整个 Block,然后把 Block 中的有效数据和新数据写入到另一个空白的 Block 里,最后将原来的 Block 擦除掉。而 ITGC 则是利用 SSD 闲置时间在系统写入新数据之前就进行类似碎片整理的动作,将各个未写满的 Block 进行统合成尽可能写满的 Block,从而腾出更多的空 Block。这样的做法虽然可以在写入操作较为空闲的情形下提升性能,但是代价是牺牲了 SSD 耐用度。

0
相关文章