当前位置: 首页 > news >正文

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

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

相关文章:

[深入理解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语言函数&#xff1a;内存函数memcpy() 引言&#xff1a; #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函数&#xff1a;C语言函数&#xff1a;字…...

ArcGIS基础:栅格分区转矢量再裁剪面图层【重分类】【栅格转面】

如上所示&#xff0c;是一个原始的栅格数据&#xff08;DEM&#xff09;&#xff0c;本操作将其转为矢量要素并裁剪另外的面图层 右键属性查看数据类型&#xff0c;可以发现此栅格数据属于【浮点型】&#xff0c;这里需要注意的是&#xff1a;栅格转为矢量数据时&#xff0c;必…...

vue尚品汇商城项目-day02【11.对axios二次封装+12.接口统一管理】

文章目录11.对axios二次封装11.1为什么需要进行二次封装axios&#xff1f;11.2在项目当中经常有API文件夹【axios】12.接口统一管理12.1跨域问题12.2接口统一管理12.3不同请求方式的src/api/index.js说明本人其他相关文章链接11.对axios二次封装 安装命令&#xff1a;cnpm inst…...

并发编程-2

1.锁的分类 1.1 可重入锁、不可重入锁 Java中提供的synchronized&#xff0c;ReentrantLock&#xff0c;ReentrantReadWriteLock都是可重入锁。 1.1.1重入&#xff1a; 当前线程获取到A锁&#xff0c;在获取之后尝试再次获取A锁是可以直接拿到的。 1.1.2不可重入&#xff…...

万字解析Linux内核调试之动态追踪

文章介绍几种常用的内核动态追踪技术&#xff0c;对 ftrace、perf 及 eBPF 的使用方法进行案例说明。 1、什么是动态追踪 动态追踪技术&#xff0c;是通过探针机制来采集内核或者应用程序的运行信息&#xff0c;从而可以不用修改内核或应用程序的代码&#xff0c;就获得调试信…...

Spring Boot 各层作用与联系

目录 1 Entity 层 2 DAO 层 3 Service 层 4 Controller 层 Spring Boot 各层之间的联系&#xff1a; controller 层-----> service 层(接口->接口实现类) -----> dao 层的.mapper 文件 -----> 和 mapper 层里的.xml 文件对应 1 Entity 层 实体层&#xff0c;…...

苦中作乐---竞赛刷题(15分-20分题库)

&#xff08;一&#xff09;概述 &#xff08;Ⅰ&#xff09;彩票是幸运的 &#xff08;Ⅱ&#xff09;AI 英文问答程序 &#xff08; Ⅲ &#xff09; 胎压检测 &#xff08;二&#xff09;题目 Ⅰ 彩票的号码有 6 位数字&#xff0c;若一张彩票的前 3 位上的数之和等于后 3 …...

超详细,多图,PVE安装以及简单设置教程(个人记录)

前言: - 写这个的目的是因为本人健忘所以做个记录以便日后再折腾时查阅,。 - 本人笔拙如有选词&#xff0c;错字&#xff0c;语法&#xff0c;标点错误请忽视&#xff0c;大概率知道了也不会修改&#xff0c;本人能看懂就好。 - 内容仅适用于本人的使用环境&#xff0c;不同…...

茴子的写法:关于JAVA中的函数传递语法糖:lambda

解决的问题&#xff1a;Java中实现函数传递。 在Java编程的实践过程中&#xff0c;有一些场景&#xff0c;我们希望能够将函数传递进去&#xff0c;不同的函数实现代表着不同的策略&#xff0c;这在JDK8以前&#xff0c;需要定义一个接口&#xff0c;这个接口中定义这个函数方…...

动态规划刷题记录(2)

今天的三个题目属于模板题&#xff0c;可能将来会遇见它们的变形应用。 1、最长上升子序列问题 这道题目的关键就在于我们的状态定义&#xff0c;我们定义&#xff1a;f(i)表示长度为i的子序列的末尾最大值。意思就是&#xff0c;比如一个子序列为&#xff1a;1,4,5&#xff0…...

2023年广东省网络安全竞赛——Web 渗透测试解析(超级详细)

任务一:Web 渗透测试 任务环境说明: √ 服务器场景:Server03 √ 服务器场景操作系统:未知(关闭连接) 通过本地 PC 中的渗透测试平台 Kali 对靶机进行 WEB 渗透,找到页面内的文件上传漏洞并且尝试进行上传攻击,将文件上传成功后的页面回显字符串作为Flag 提交(如:…...

MI-SegNet阅读笔记

MI-SegNet: Mutual Information-Based US Segmentation for Unseen Domain Generalization 摘要 解决医学成像泛化能力提出了一种新的基于互信息(MI)的框架MI- segnet分离解剖结构和领域特征采用两个编码器提取相关特征&#xff1a;两个特征映射中出现的任何MI都将受到惩罚&a…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...