声明
主页: 元存储的博客_CSDN博客
公开知识及经验整理,如有误请留言。
个人辛苦整理,付费内容,禁止转载。
内容摘要
![](https://img-blog.csdnimg.cn/img_convert/3bc4d13707dfcdaea1d132f8376bfec6.jpeg)
Hello 大家好, 我是元存储~
主页:元存储的博客_CSDN博客-深入理解SSD:固态存储特性与实践,深入浅出SSD:固态存储原理与特性,深入理解Flash:闪存特性与实践领域博主
前言
SSD上已经被写入过的Page页在重新被写入之前,必须要将page页所在的block块擦除,而不是直接覆盖写。这个是由Nand Flash的工作原理决定的。因此产生了GC的概念.
GC 是什么?
GC(Garbagecollection)垃圾回收
所谓GC就是把一个闪存块里的"有效"页数据复制到一个"空白"块里,然后把这个旧的块完全擦除。GC是 SSD里的一个非常关键的操作,其效率对性能有决定性影响。闪存块里"有效"页的数量对GC效率有决定性的影响,因数量越少,需要复制的页就越少, 花费的时间也越少,效率就高了。
![](https://img-blog.csdnimg.cn/img_convert/67dc0f1e47b08df36545554f69825e48.jpeg)
GC触发的机制
主机写数据的操作需要有“空白”块来写入更新后的数据。当可以直接写入数据的备用“空白块”数量低于一个阈值(厂商在主控 固件里设置,一般为全盘闪存容量写满后),触发GC。
GC分类
由于GC会对SSD产生大量负载,因此GC可分闲置GC及被动GC。
3.1 闲置垃圾回收
闲置GC, 也叫Background GC(后台垃圾回收)。[3] 是让SSD主控在系统闲置时‘提前’进行GC操作,产生一定 数量的‘空白’块,让GC操作不至于明显影响用户使用感受,但缺点是会因此造成额外的WA(写入放大,相关知识会独立介绍),因为刚GC的‘有效’ 数据可能会因为用户更新而变‘无效’。闲置GC不占用主控资源,会增加一定额外的写放大。
3.2 被动垃圾回收
被动GC 也叫Foreground GC(前台垃圾回收),是所有SSD一定具备的,SSD主控性能对被动GC效率有决定性影响,因为此时SSD需要同时进行GC及 用户要求的数据操作,在数据读写同时做垃圾回收,会占用大量主控资源,对请求的响应时间造成一定影响。主控性能不足就会让用户发觉SSD的性能下降。
3.3 HMS
除了SSD本身,有些SSD还支持主机控制其做GC。主机管理SSD的功能即HMS(Host Managed SSD)技术。HMS就是主机通过应用软件获取SSD的运行状态,然后控制SSD的一些行为。使用者可以通过HMS软件在SSD空闲时让其执行GC任务。【3】
GC粒度
闪存最小读写单位是page,但是最小擦除单位是block。 GC 的最小颗粒也是块。
为什么需要GC?
一个block中包含多个page;SSD工作一段时间之后,block就都是有过写入的了,如果要擦除某个block,必须先将其中的有效page复制到其他地方,再擦除旧的block.
感兴趣可以看 [SSD14] GC垃圾回收太重要了
GC过程
简单分为三步[3]:
1)挑选源闪存块;
2)从源闪存块中找有效数据;
3)把有效数据写入到目标闪存块中;
第一步挑选源闪存块,一个常见的算法就是挑选有效数据最小的块,这样需要重写的有效数据就越少,回收一个块的代价也最小。
如何找到有效数据最小的那个块呢?
这需要FW在写用户数据时做一些额外的工作,即记录和维护每个闪存块的有效数据量。用户每往一个新的块上写入一笔用户数据,该闪存块上的有效数据就加1。同时还需要要找到这笔数据之前所在的块(如果之前该笔数据曾写入过),由于该笔数据写入到新的块,那么在原闪存块上的数据就变无效了,因此原闪存块上的有效数据量就应该减1.
第二步就是把有效数据从源闪存块读出来。如何知道哪些数据是有效的,哪些又是无效的呢?
如果FW不仅仅只更新和维护闪存块的有效数据量(第一步),还给闪存块一个Bitmap表,标识哪个物理页是否有效,那么在做GC的时候FW只需要根据Bitmap表的信息,把有效数据读出,然后重写即可。
具体做法即FW把一笔逻辑页写入到某个闪存块时,该闪存块上对应位置的Bit就置1。一个闪存块上新增一笔有效数据,就意味着该笔数据所在的前一个闪存块上数据变成无效,因此需要把前一个闪存块对应的位置的Bit清0。
由于有了闪存块上有效数据的Bitmap,在做GC的时候,FW就能准确定位到有效数据并读出。
请看下图,把X块和Y块里的“有效”页复制到N块里,然后擦除X和Y以作备用的“空白块”。
![](https://img-blog.csdnimg.cn/img_convert/8e4880c56a3d46ff6c8fbc42fb596d24.jpeg)
那么SSD主控就会把包含“无效”数据的块里所有“有效”数据合并起来放到新的“空白”块里,并删除“无效”数 据块来增加备用的“空白块”数量。这个操作就是SSD的GC过程。
Trim 对GC 的好处
7.1 文件删除过程
我们先看看一个文件删除的动作吧
操作系统:其实并没有删除数据;
事实上,它只是在硬盘前的索引区里标记这块文件占用的区域为无效的,
所以等该区域被擦除后,下次数据将要再次写入的时候,可以写入这块被标记的区域。
这也就是为啥那 些所谓的文件恢复软件能恢复的道理。(数据依然存在)。
扩展: 电脑硬盘文件数据误删除/格式化为什么可以恢复? 怎么恢复?谈谈文件删除与恢复背后的原理_元存储的博客-CSDN博客
固态硬盘:在固态硬盘闪存内,数据存储一般是以page(页)为最小单位存储的(典型的为4KB),而128个page组成了一个block(块),数据以页(page)为单位来读取和写入,但却只能以块Block)为单位来删除。当读取数据或者写入到一个没有被使用过的page上时,固态硬盘的速度是很快的,但是在无效数据区上的话,就比较复杂了,需要许多步骤来完成。
*注意:硬盘本身是不知道当前数据的状态的,他只是被控制着做这做那。
上面这一套在普通的机械硬盘上工作起来非常完美,因为他们可以直接覆写旧的区域,但是当用到NAND闪存上就行不通了,当全部闪存被写满一遍后,没有空白 (从未写过)的块可以被使用的情况下,速度就下来了。
这个问题是因为操作系统和文件系统不能和SSD的主控进行删除文件的交流造成的[4],如果有之前没清除干净的数据,GC 是主控还认为这些是有效数据,势必会做一些无用工作,并且因为充斥着大量host 删除但未标记无效的数据,使得空白块比较难释放, 要做很多搬移数据的工作,GC 就做的比较慢。这带来不好的影响就是写入放大率变大, 性能也降低。
7.2 操作系统Trim 命令?
删除文件后, 操作系统可以下 trim 命令通知SSD, 这些数据是无效的了, 它们的物理空间去做其他用途, GC 的时候直接知道这部分数据是无效数据,不需要搬移。Trim指令的效果就是直接产生更多的‘无效’页数据,减轻GC的压力,从而减少用户发觉SSD性能下降的机会。(Trim相关知识后面会 独立介绍)各位要记住,GC是每个SSD必备的,没有GC的那只能是U盘,而不是SSD,而且任何时候性能相比SSD都只能用‘烂’来形容。[2]
7.3 Trim的三要素
1. 系统: Win7, 2008R2 , Linux核心2.6.28以上。
2. 固件: SSD的厂商在固件里要放有Trim算法。
3. 驱动: MS的驱动,Intel的AHCI驱动目前支持。
GC对 NAND 闪存寿命影响
垃圾回收操作由于将不同 Block 中的有效 Page 进行合并,有额外的擦除操作,会增加写入放大。因此过于频繁的垃圾回收会对 NAND 寿命产生影响 (部分主控芯片为了存取速度,会频繁的做回收的动作,其他的大部分则是在有必要时才做)。如何在避免擦写与提升速度间取得一个平衡,是衡量固件算法的重要指标。
至于有人会说,既然迟早都要重新擦写,那为什么说垃圾回收不要太频繁对 SSD 寿命有好处,简单的说,因为刚GC的‘有效’ 数据可能会因为用户更新而变‘无效’, 如果晚一点GC, 可能这笔数据有机会被主机删除,就省掉不用搬了。但频繁做GC 的化,就都要搬一遍,甚至很多遍。所以经常进行 GC 自然对寿命影响不小,所以在速度和寿命的取舍往往是两难的问题,速度快的 SSD,往往也就是垃圾回收的比较勤快。
搬移数据会增加写入放大率,写入放大率就反映在闪存颗粒的PE cycle 消耗上。其实 NAND 闪存芯片的编程/擦除(P/E)周期次数是一定的。目前普遍使用的 TLC 闪存 P/E 周期为 3000 次左右,一些优质颗粒可以达到 5000 次,超过这个阈值闪存闪存芯片就会报废。
参考
[1] https://blog.csdn.net/Gloria_y/article/details/120969414
[2] https://www.bbsmax.com/A/gAJG9jEgdZ/
[3] https://www.cnblogs.com/Zhd199181/p/16366976.html
[4] https://www.shuzhiduo.com/A/Ae5RMqPrJQ/
[5] https://blog.csdn.net/weixin_39287177/article/details/81407843