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

Hello 大家好, 我是元存储~
主页:元存储的博客_CSDN博客-深入理解SSD:固态存储特性与实践,深入浅出SSD:固态存储原理与特性,深入理解Flash:闪存特性与实践领域博主
前言
SSD上已经被写入过的Page页在重新被写入之前,必须要将page页所在的block块擦除,而不是直接覆盖写。这个是由Nand Flash的工作原理决定的。因此产生了GC的概念.
GC 是什么?
GC(Garbagecollection)垃圾回收
所谓GC就是把一个闪存块里的"有效"页数据复制到一个"空白"块里,然后把这个旧的块完全擦除。GC是 SSD里的一个非常关键的操作,其效率对性能有决定性影响。闪存块里"有效"页的数量对GC效率有决定性的影响,因数量越少,需要复制的页就越少, 花费的时间也越少,效率就高了。

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

那么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
相关文章:
[深入理解SSD 21] 固态硬盘GC机制 | GC 分类 | GC 过程 | GC 和 Trim 的关系
Hello 大家好, 我是元存储~主页:元存储的博客_CSDN博客-深入理解SSD:固态存储特性与实践,深入浅出SSD:固态存储原理与特性,深入理解Flash:闪存特性与实践领域博主前言SSD上已经被写入过的Page页在重新被写入之前,必须要将page页所在的block块…...
大数据未来发展怎么样?
就目前情况来看,大数据行业前景不错薪资待遇好,也有越来越多的人选择大数据行业,各大名企对于大数据人才需求不断上涨。 大数据从业领域很宽广,不管是科技领域还是食品产业,零售业等都是需要大数据人才进行大数据的处…...
【Linux】进程和线程间的区别与联系
带你轻松理解进程与线程的区别与联系: 进程线程定义资源分配和拥有的基本单位CPU调度的基本单位切换情况对应进程的CPU环境的保存以及新进程环境的设置保存和设置程序计数器,少量的寄存器,以及对应的线程栈切换者操作系统操作系统切换过程用…...
【C语言】变量和常量
目录 1. 变量 1.1 变量的分类 1.1.1 局部变量 1.1.2 全局变量 1.2 变量的使用——声明、赋值、初始化 1.3 变量的作用域和生命周期 1.3.1 作用域 1.3.2 生命周期 2. 常量 2.1 字面常量 2.2 常变量(const常量) 2.3 简单的宏(对象式…...
蓝桥杯-卡片换位(BFS)
蓝桥杯-卡片换位 1、题目描述2、解题思路3、完整代码(AC)1、题目描述 你玩过华容道的游戏吗? 这是个类似的,但更简单的游戏。 看下面 3 x 2 的格子 +---+---+---+| A | * | * |+---+---+---+| B | | * |+---+---+---+在其中放 5 张牌,其中 A 代表关羽,B 代表张飞,* 代表士…...
霍夫曼编码 | 贪心算法 2
霍夫曼编码是一种无损数据压缩算法。其思想是为输入字符分配可变长度代码,分配代码的长度基于相应字符的频率。 分配给输入字符的可变长度代码是前缀代码,意味着代码(位序列)的分配方式是分配给一个字符的代码不是…...
async 与 await
目录一、async函数二、await表达式三、async与await结合一、async函数 函数的返回值为promise对象promise对象的结果由async函数执行的返回值决定 async function main(){//1.如果返回的是一个非promise类型的数据,那么返回的就是成功的状态// return 521//2.如果…...
MYSQL语句
在 Navicat Premium 里面test_database数据库 ,右击 “命令列界面..” 命令列界面 中 输入命令 查看所有的数据库 show databases; 选择数据库 -- use 数据库名; use test_database; 创建表 creat table 表名(字段名1 数据类型,字段名2 数据类型) -- 创建…...
C语言函数:内存函数memcpy()以及实现
C语言函数:内存函数memcpy() 引言: #define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>int main() {int arr1[20] { 1,2,3,4,5,6,7,8,9 };int arr2[20] { 0 };strcpy(arr2, arr1);return 0; } strcpy函数:C语言函数:字…...
ArcGIS基础:栅格分区转矢量再裁剪面图层【重分类】【栅格转面】
如上所示,是一个原始的栅格数据(DEM),本操作将其转为矢量要素并裁剪另外的面图层 右键属性查看数据类型,可以发现此栅格数据属于【浮点型】,这里需要注意的是:栅格转为矢量数据时,必…...
vue尚品汇商城项目-day02【11.对axios二次封装+12.接口统一管理】
文章目录11.对axios二次封装11.1为什么需要进行二次封装axios?11.2在项目当中经常有API文件夹【axios】12.接口统一管理12.1跨域问题12.2接口统一管理12.3不同请求方式的src/api/index.js说明本人其他相关文章链接11.对axios二次封装 安装命令:cnpm inst…...
并发编程-2
1.锁的分类 1.1 可重入锁、不可重入锁 Java中提供的synchronized,ReentrantLock,ReentrantReadWriteLock都是可重入锁。 1.1.1重入: 当前线程获取到A锁,在获取之后尝试再次获取A锁是可以直接拿到的。 1.1.2不可重入ÿ…...
万字解析Linux内核调试之动态追踪
文章介绍几种常用的内核动态追踪技术,对 ftrace、perf 及 eBPF 的使用方法进行案例说明。 1、什么是动态追踪 动态追踪技术,是通过探针机制来采集内核或者应用程序的运行信息,从而可以不用修改内核或应用程序的代码,就获得调试信…...
Spring Boot 各层作用与联系
目录 1 Entity 层 2 DAO 层 3 Service 层 4 Controller 层 Spring Boot 各层之间的联系: controller 层-----> service 层(接口->接口实现类) -----> dao 层的.mapper 文件 -----> 和 mapper 层里的.xml 文件对应 1 Entity 层 实体层,…...
苦中作乐---竞赛刷题(15分-20分题库)
(一)概述 (Ⅰ)彩票是幸运的 (Ⅱ)AI 英文问答程序 ( Ⅲ ) 胎压检测 (二)题目 Ⅰ 彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 …...
超详细,多图,PVE安装以及简单设置教程(个人记录)
前言: - 写这个的目的是因为本人健忘所以做个记录以便日后再折腾时查阅,。 - 本人笔拙如有选词,错字,语法,标点错误请忽视,大概率知道了也不会修改,本人能看懂就好。 - 内容仅适用于本人的使用环境,不同…...
茴子的写法:关于JAVA中的函数传递语法糖:lambda
解决的问题:Java中实现函数传递。 在Java编程的实践过程中,有一些场景,我们希望能够将函数传递进去,不同的函数实现代表着不同的策略,这在JDK8以前,需要定义一个接口,这个接口中定义这个函数方…...
动态规划刷题记录(2)
今天的三个题目属于模板题,可能将来会遇见它们的变形应用。 1、最长上升子序列问题 这道题目的关键就在于我们的状态定义,我们定义:f(i)表示长度为i的子序列的末尾最大值。意思就是,比如一个子序列为:1,4,5࿰…...
2023年广东省网络安全竞赛——Web 渗透测试解析(超级详细)
任务一:Web 渗透测试 任务环境说明: √ 服务器场景:Server03 √ 服务器场景操作系统:未知(关闭连接) 通过本地 PC 中的渗透测试平台 Kali 对靶机进行 WEB 渗透,找到页面内的文件上传漏洞并且尝试进行上传攻击,将文件上传成功后的页面回显字符串作为Flag 提交(如:…...
MI-SegNet阅读笔记
MI-SegNet: Mutual Information-Based US Segmentation for Unseen Domain Generalization 摘要 解决医学成像泛化能力提出了一种新的基于互信息(MI)的框架MI- segnet分离解剖结构和领域特征采用两个编码器提取相关特征:两个特征映射中出现的任何MI都将受到惩罚&a…...
基于AI智能体的渗透测试框架:从自动化到智能协同的范式转变
1. 项目概述:一个面向渗透测试的智能体框架最近在整理自己的工具链时,发现了一个挺有意思的项目,叫GH05TCREW/pentestagent。乍一看这个名字,你可能会觉得这又是一个“缝合怪”式的自动化渗透工具,把Nmap、SQLmap之类的…...
如何通过Jellyfin Android TV客户端打造家庭影院级媒体体验?
如何通过Jellyfin Android TV客户端打造家庭影院级媒体体验? 【免费下载链接】jellyfin-androidtv Android TV Client for Jellyfin 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-androidtv 想要在智能电视上享受专业的媒体管理体验吗?…...
Wand-Enhancer:零成本解锁WeMod高级功能的完整指南
Wand-Enhancer:零成本解锁WeMod高级功能的完整指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod专业版的订阅费用而犹豫不决吗…...
基于Docker部署OpenOffice无头服务实现文档自动化处理
1. 项目概述与核心价值最近在折腾文档处理自动化流程,发现很多老项目或者特定场景下,对Office文档的兼容性要求极高,尤其是那些需要处理.doc、.xls、.ppt等老格式的场景。直接用现代办公套件(比如LibreOffice)去处理&a…...
Obsidian智能模板终极指南:3步打造高效笔记自动化系统
Obsidian智能模板终极指南:3步打造高效笔记自动化系统 【免费下载链接】Templater A template plugin for obsidian 项目地址: https://gitcode.com/gh_mirrors/te/Templater Templater插件是Obsidian生态系统中功能最强大的智能模板解决方案,它能…...
ComfyUI-Manager终极指南:3步掌握AI绘画插件管理技巧
ComfyUI-Manager终极指南:3步掌握AI绘画插件管理技巧 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various custom…...
容器化技术实战:从Docker到Kubernetes的体系化学习路径
1. 项目概述:一个容器化时代的“瑞士军刀”训练营 如果你正在或即将踏入容器化技术领域,无论是刚接触Docker的新手,还是想系统梳理Kubernetes的开发者,又或者是需要为团队进行技术培训的架构师,那么“jpetazzo/contai…...
Node.js性能预测工具nodestradamus:从监控到预警的实践指南
1. 项目概述与核心价值最近在折腾一些服务器监控和性能预测的活儿,偶然间在GitHub上发现了一个叫nodestradamus的项目,作者是ChristosGrigoras。这个名字挺有意思,结合了“Node.js”和“诺查丹玛斯”(那位著名的预言家)…...
零售行业 Multi-Agent 案例:智能导购与库存管理的协同系统拆解
零售行业 Multi-Agent 案例:智能导购与库存管理的协同系统拆解 摘要/引言 开门见山 “叮咚——您的专属导购Luna上线啦!请问今天想找什么风格的连衣裙?要不要看看系统为您推荐的通勤款A字裙,您上周收藏的碎花衫刚好可以搭配&#…...
【实用小程序】超轻量级文件上传下载中心 (File Download Server)
站内源码及jar包下载 一、项目概述 文件下载中心一个基于 Java 内置 HTTP 服务器(com.sun.net.httpserver)构建的轻量级文件管理服务。它零第三方依赖,单 JAR 包即可运行,适合在内网环境或临时场景中快速搭建文件共享站点。 你的团队需要临时共享一批日志文件或交付物,…...
