深入解析SSD Wear Leveling磨损均衡技术:如何让你的硬盘更长寿?

2023-11-21 08:20

本文主要是介绍深入解析SSD Wear Leveling磨损均衡技术:如何让你的硬盘更长寿?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

图片

SSD的存储介质是什么,它就是NAND闪存。那你知道NAND闪存是怎么工作的吗?其实,它就是由很多个晶体管组成的。这些晶体管里面存储着电荷,代表着我们的二进制数据,要么是“0”,要么是“1”。NAND闪存原理上是一个CMOS管,有两个栅极,一个是控制栅极(Control Gate), 一个是浮栅(Floating Gate). 浮栅的作用就是存储电荷,而浮栅与沟道之间的氧化层(Oxide Layer)的好坏决定着浮栅存储电荷的可靠性,也就是NAND闪存的寿命

图片

目前市面上主要流通的就是4种NAND类型:SLC、MLC、TLC、QLC。随着每个寿命从高到低依次是SLC>MLC>TLC>QLC.

图片

SSD的闪存芯片并非完美无缺。它们有一个共同的“短板”——寿命受限于闪存单元的磨损。在SSD中,每个闪存单元都有一定的寿命,通常为几万次到几百万次的写入。当一个单元被写满时,它就会被标记为“坏块”,不再用于存储数据。这种磨损效应会导致SSD的性能下降,甚至完全失效。

在现实应用过程中,SSD主控在NAND闪存写入数据时,并非均匀等机会的写入NAND闪存的每一个区块(Block)。借用宋小宝的经典桥段,SSD主控很难做到“雨露均沾”,而是很大程度可能会“独宠”一些NAND闪存区块。但是这样的“独宠”会严重透支NAND闪存区块寿命(NAND闪存区块的磨损-Write/Earse count会大大的增加,性能变差)

图片

为了解决这个问题,Wear Leveling技术应运而生。Wear Leveling是一种用于平衡SSD闪存单元磨损的技术,它的作用是尽可能将数据均匀地分布在各个闪存单元中,从而延长SSD的使用寿命。用更通俗的话来讲就是,每次写入的时候挑年轻力壮的区块, 年老的区块则颐养天年

SSD由多个独立的NAND Flash芯片组成,每个NAND Flash由一个块阵列组成,每个块由一系列的存储单元(页)组成。在将数据写入NAND Flash的存储单元之前,必须对该存储单元进行擦除,以便可以进行写入。最小的擦除单元是块,最小的写入或者读取单元是页。

图片

Wear Leveling的工作流程:Wear Leveling技术在SSD中通过设置两个块池,一个是空闲池,一个是数据池,来实现磨损平衡。当需要改写某个页时,并不直接写入原有位置,而是从空闲池中取出新的块,将现有的数据和需要改写的数据合并为新的块,一起写入新的空白块,原有的块被标识为无效状态(等待被擦除回收),新的块则进入数据池。后台任务会定时从数据池中取出无效数据的块,擦除后回收到空闲池中。

图片

根据实现方式的不同,Wear Leveling通常可以分为动态损耗均衡(Dynamic Wear Leveling)和静态损耗均衡(Static Wear Leveling)。

动态损耗均衡是一种只在数据被改写时触发的均衡技术。当一个数据块被更新时,动态损耗均衡算法会计算出各个闪存单元的损耗情况,并选择损耗最严重的单元进行数据迁移。这种方式的优点是处理速度快,对性能影响小;缺点是对静态数据的处理效果不佳。

图片

静态损耗均衡则是一种可以处理静态数据的均衡技术。它可以在后台运行,当发现损耗较低的闪存单元时,将其数据迁移到其他单元上,并将这些单元放入空闲池中备用。这种方式的优点是可以更好地保护静态数据;缺点是处理速度较慢,可能会对性能产生一定影响。

图片

在Windows环境,如果需要监控查看SSD坏块的健康状态,比较简单,只可以用DiskGenius工具可以做个全盘扫描。

图片

图片

Linux环境下,建议SATA SSD用smartctl工具、NVME SSD用nvme-cli进行long DST全盘自检测。

图片

最后,提前剧透一下:写这篇文章,其实是为了给后面一篇WL相关的文章做铺垫,预计本周内发布,敬请期待!

这篇关于深入解析SSD Wear Leveling磨损均衡技术:如何让你的硬盘更长寿?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/401065

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java JDK Validation 注解解析与使用方法验证

《JavaJDKValidation注解解析与使用方法验证》JakartaValidation提供了一种声明式、标准化的方式来验证Java对象,与框架无关,可以方便地集成到各种Java应用中,... 目录核心概念1. 主要注解基本约束注解其他常用注解2. 核心接口使用方法1. 基本使用添加依赖 (Maven