固态硬盘(SSD)中的软件算法

作者: 王涪玖 | 来源:发表于2017-07-31 16:57 被阅读111次

    原文:[绝不只是堆砌闪存!SSD 中的软件算法你知多少]

    SSD 已经日渐流行,现在买电脑不挑带 SSD 的,都不好意思说自己真懂用户体验。和传统 HDD 相比,SSD 由闪存构成,闪存低延迟的特性,令 SSD 在随机读写性能方面大幅超越 HDD,这也是 SSD 能带来流畅操作体验的关键。但是,SSD 又不仅仅只是闪存的简单组装,仅仅把闪存堆砌起来,并不能称作是 SSD。调用闪存的软件算法,同样对 SSD 的寿命、稳定性、性能等方方面面起着重大作用。SSD 中的软件算法你都了解吗?今天,就一起来谈谈 SSD 中有哪些软件算法吧!


    SSD 可不是把闪存焊在一起就能做出来的

    FTL:没它 SSD 就无法识别
    我们都知道 SSD 的硬件构成和 HDD 完全不同,因此操作系统识别 HDD 的很多机制,并不适用于 SSD。例如,硬盘是由盘片来构成的,盘片是同心圆,把圆分成一个个小小的扇形,数据在这些扇形中储存,这些扇形就被称之为扇区。操作系统把扇区组织起来,构成 FAT32、NTFS 等文件系统,用户才得以访问文件/文件夹而不是一个个的扇区物理地址。基本上,操作系统建立文件系统的基础就是扇区。


    HDD 硬盘盘片上的扇区,SSD 没有这个结构

    SSD 由闪存构成,没有盘片,自然也没有扇区。SSD 的闪存颗粒基础单位是数据容量 4KB 的 Page(页),Page 组成 Block(区),Block 组成 Plane(平面),最后 Plane 组成 Die(晶片),这就是闪存的硬件架构。可见 SSD 没有扇区,怎么办?这就得靠一些算法来进行转换了。



    SSD 使用的是闪存,闪存结构和 HDD 不同,需要 FTL 层和文件系统对话,把 SSD 的架构虚拟成 HDD 的算法,叫做“FTL”(Flash Translation Lay)。FTL 算法是由 SSD 主控提供的,比操作系统更加底层。FTL 作为一个软件中间层,可以把 SSD 基于 Page 的硬件架构映射成 HDD 基于扇区的硬件架构。操作系统为 SSD 建立文件系统的时候,有了 FTL,操作系统看到的东西和 HDD 没啥两样,就可以用传统的方法对 SSD 进行分区、格式化等操作,不需要使用专为 SSD 而生的文件系统。得益于 FTL 软件算法,SSD 才能无缝接班 HDD,没它 SSD 就无法识别。

    GC 垃圾回收:没它 SSD 就巨慢无比
    闪存的机制是比较独特的,当你向闪存写入数据的时候,必须先把闪存中的数据擦除掉,才能写入。同时,闪存的最小读写单位是 Page,但最小的擦除单位是 Block。一个 Block 中包含了多个 Page,SSD 工作一段时间后,就没有哪个 Block 中的 Page 都是空白的了。如果要擦除某个 Block,就必须先把这个 Block 中存在有效数据的 Page 复制备份到其他地方,接而进行擦除,这样一来才不会丢数据。


    每个 Page 都可以写入数据,但覆盖写入需要先擦除原先的数据,一擦除整个 Block 都会被擦除
    有效数据的 Page 要复制到什么地方进行备份呢?一些比较烂的产品,会把这些 Page 的数据复制到缓存,待到 Block 擦除后,再把数据写回去,这样一来 SSD 的写入速度就更加悲剧了——既要写原来的数据,又要写新数据。解决这个问题的,就是 SSD 中的 GC(Gabage Collection),也就是垃圾回收算法。
    GC 垃圾回收算法看着有点类似碎片整理,它可以把某个 Block 中的存在有效数据的 Page,移动到其他 Block 中,从而让操作系统得以擦除这整一个 Block。接着再往该 Block 写数据,就不需要把备份到其他地方的 Page 也写回去了。CG 发生在 FTL 层,不同的 SSD 的 GC 算法是不一样的,GC 算法的不同,深切影响着 SSD 的性能。

    Trim:大大提高垃圾回收效率
    Trim 是一种用来增加 GC 垃圾回收效率的算法。没有 Trim 的话,会出现这样一种情况:在操作系统删除一个文件,实际上数据在物理层面上并没有被删除。于是,SSD 的某个 Block 所有 Page 都会被填满,待到真正写入数据的时候,才被迫进行 GC 垃圾回收,主控才开始把有效数据的 Page 移动到其他 Block 上,进而擦除该 Block。如此一来,速度就很慢,SSD 用久了每次写入数据都得先 GC,用户体验非常不好。


    CMD 中查询“fsutil behavior QUERY DisableDeleteNotify”,如图显示就是开启了 Trim

    Trim 就可以大大缓解这种情况。操作系统删除数据后,Trim 会告诉 SSD 主控哪些 Page 的数据对应着删除的数据,这些 Page 会被标记成为无效 Page。接着,在闲暇时段,SSD 主控就会主动进行 CG,把有效数据的 Page 移走,然后擦除这些 Block 的数据,提前为操作系统的数据写入准备好足够多的 Block。如此一来,就算是长期使用,只要 SSD 不是装得太满,性能都不会有太过明显的下滑,大大提升了用户体验。Trim 算法是由操作系统提供的,Win7、Android 4.3 以后的操作系统都支持 Trim。

    磨损平衡:保证闪存寿命被均匀消耗
    我们知道闪存是有擦写寿命的,例如 MLC 闪存只能够擦写数千次,TLC 闪存只能够擦写数百次等等。其实以现在的 SSD 容量,总擦写数据量是非常惊人的,例如 256G 的 SSD,寿命是 500 次擦写(P/E)的话,那么就需要写入 125TB 的数据,闪存才寿终正寝——就算你每天写入 10G 数据,也需要用三十多年才能把闪存给写挂,更何况很少人每天往 SSD 中写 10G 数据。


    TLC 的擦写次数不尽如人意,但正常使用其实也很难挂掉

    但是很多朋友仍不信任 SSD 的寿命,理由是 SSD 的这个寿命,是根据全盘容量来估算的。有的朋友认为,平时读写数据,会集中读写 SSD 的其中一部分闪存,这部分的闪存寿命就会损耗得特别快。一旦这部分闪存挂了,那么整块 SSD 也就挂了。然而事实真的是这样吗?

    事实当然并非如此。实际上,SSD 拥有磨损平衡(Wear Leveling)算法,令所有闪存磨损度尽可能保持一致。SSD 的磨损平衡算法大致分为动态和静态两种。动态的算法就是当写入新数据的时候,会自动往比较新的 Block 中去写,老的闪存就放在一旁歇歇;而静态的算法就更加先进,就算没有数据写入,SSD 监测到某些闪存 Block 比较老,会自动进行数据分配,让比较老的闪存 Block 承担不需要写数据的储存任务,同时让较新的闪存 Block 腾出空间,平日的数据读写就在比较新的 Block 中进行——如此一来,各个 Block 的寿命损耗,就都差不多了。

    总结
    SSD 绝不是把闪存堆在一起就能做成的,要让 SSD 稳定、快速地运行,还有赖于种种软件算法。在选用 SSD 的时候,可以多关注一下该 SSD 所使用的主控方案,关注该主控的算法是否靠谱;在使用 SSD 时,要选择适合的操作系统,并及时更新 SSD 的固件和驱动。如此一来,才会得到更好的体验。

    相关文章

      网友评论

        本文标题:固态硬盘(SSD)中的软件算法

        本文链接:https://www.haomeiwen.com/subject/zgyrlxtx.html