[深入理解SSD 21] 固态硬盘GC机制 | GC 分类 | GC 过程 | GC 和 Trim 的关系

news/2024/5/19 1:32:03 标签: 固态硬盘, SSD, linux, 嵌入式硬件

Hello 大家好, 我是元存储~

主页:元存储的博客_CSDN博客-深入理解SSD:固态存储特性与实践,深入浅出SSD:固态存储原理与特性,深入理解Flash:闪存特性与实践领域博主

前言

SSD上已经被写入过的Page页在重新被写入之前,必须要将page页所在的block块擦除,而不是直接覆盖写。这个是由Nand Flash的工作原理决定的。因此产生了GC的概念.

  1. GC 是什么?

GC(Garbagecollection)垃圾回收

所谓GC就是把一个闪存块里的"有效"页数据复制到一个"空白"块里,然后把这个旧的块完全擦除。GC是 SSD里的一个非常关键的操作,其效率对性能有决定性影响。闪存块里"有效"页的数量对GC效率有决定性的影响,因数量越少,需要复制的页就越少, 花费的时间也越少,效率就高了。

  1. GC触发的机制

主机写数据的操作需要有“空白”块来写入更新后的数据。当可以直接写入数据的备用“空白块”数量低于一个阈值(厂商在主控 固件里设置,一般为全盘闪存容量写满后),触发GC。

  1. 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】

  1. GC粒度

闪存最小读写单位是page,但是最小擦除单位是block。 GC 的最小颗粒也是块。

  1. 为什么需要GC?

一个block中包含多个page;SSD工作一段时间之后,block就都是有过写入的了,如果要擦除某个block,必须先将其中的有效page复制到其他地方,再擦除旧的block.

感兴趣可以看 [SSD14] GC垃圾回收太重要了

  1. 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以作备用的“空白块”。

  那么SSD主控就会把包含“无效”数据的块里所有“有效”数据合并起来放到新的“空白”块里,并删除“无效”数 据块来增加备用的“空白块”数量。这个操作就是SSD的GC过程。

  1. 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驱动目前支持。

  1. 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


http://www.niftyadmin.cn/n/192461.html

相关文章

基于Misty1算法的加密软件(Java)的实现

现代密码学是一门迅速发展的应用科学。随着因特网的迅速普及,人们依靠它传送大量的信息,但是这些信息在网络上的传输都是公开的。因此,对于关系到个人利益的信息必须经过加密之后才可以在网上传送,这将离不开现代密码技术。 Mist…

力扣 2601. 质数减法运算

读研读麻了,刷刷题恢复心情。该找工作了,还在接老师画的饼,组会被喷,无限循环。搞了一年多课题,可能连水刊都发不了。以后会更一些力扣和图学习相关论文或者比赛方面的内容。 题目链接:https://leetcode.c…

LNMP-资源拆分

每天进步亿点点! 快速扩展一台WEB服务器 WEB01 NginxPHP WEB02 NginxPHP WEB02配置: 准备一台WEB02服务器 1.创建虚拟用户www [rootweb02 ~]# groupadd -g666 www [rootweb02 ~]# useradd -u666 -g666 -M -s /sbin/nologin www 2.安装Nginx [rootweb02 ~]# vim /…

洛谷 P4826 [USACO15FEB]Superbull S 图论 最小生成树

2023.4.1:更新抽象 又是鸽了三千万年... -------------------------------------------------------------------- 题目描述 Bessie and her friends are playing hoofball in the annual Superbull championship, and Farmer John is in charge of making the tou…

物理服务器安装CentOS 7操作系统

物理机安装centos7操作系统教程完整教程图解 一个U盘(不小于8G,此U盘之后会被格式化,请先备份好里面重要内容) 系统镜像(建议去官网下载,或者阿里云等可靠的镜像下载地址) 软碟通(UltraISO)映像编辑工具&am…

学习HM微博项目第4天

步骤:OAuth授权01_加载登录界面 -> OAuth授权02_获得accessToken -> OAuth授权03_存储账号信息 -> OAuth授权04_封装账号存储 -> OAuth授权05_封装控制器的切换 OAuth授权01_加载登录界面 为了测试方便,暂时把window的根控制器固定设置为授…

jupyter notebook默认快捷键

Jupyter 笔记本有两种不同的键盘输入模式。 编辑模式允许您将代码或文本输入到一个单元格中,并通过一个绿色边框的单元格来表示 命令模式将键盘与笔记本级命令绑定在一起,并通过一个灰框、左边距蓝色的单元格显示。 命令行模式(按 Esc 生效&a…

@ImportResource()注解(注入spring配置文件)

ImportResource()注解(注入spring配置文件) ImportResource注解用于导入Spring的配置文件,让配置文件里面的内容生效;(就是以前写的springmvc.xml、applicationContext.xml) Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件&am…