深入解析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

相关文章

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量