【FLASH存储器系列十八】固态硬盘FTL磨损平衡

news/2024/11/30 20:26:52/
👉个人主页: highman110
👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容

今天继续分享FTL的另一项功能:磨损平衡。

我们知道nand flash的擦写次数是有限的,从SLC十几万的擦写次数,到MLC几千的擦写次数,然后到TLC的一两千次甚至几百次擦写次数,随着闪存工艺不断向前推,闪存的寿命越来越短,而我们在平时的操作中,有可能某个block经常被擦,而有的block则使用的次数很少,所以要有一个机制来确保最好每个block的擦除次数的均衡的,这个机制就是磨损平衡。

在介绍磨损平衡之前,先说几个概念:冷数据(Cold Data)和热数据(Hot Data),年老的(Old)块和年轻的(Young)块。所谓冷数据,就是用户不经常更新的数据,比如用户写入SSD的操作系统数据、只读文件数据等;相反,热数据就是用户更新频繁的数据。数据的频繁更新,会在SSD内部产生很多垃圾数据(新的数据写入导致老数据失效)。所谓年老的块,就是擦写次数比较多的闪存块;擦写次数比较少的闪存块,年纪相对小,我们叫它年轻的块。SSD很容易区分年老的块和年轻的块,看它们的EC(Erase Count,擦除次数)就可以了,大的就是老的,小的就是年轻的。

SSD一般有动态磨损平衡(Dynamic WL)和静态磨损平衡(Static WL)两种算法。动态磨损平衡算法的基本思想是把热数据写到年轻的块上,即在拿一个新的闪存块用来写的时候,挑选擦写次数小的;静态磨损平衡算法基本思想是把冷数据写到年老的块上,即把冷数据搬到擦写次数比较多的闪存块上。

动态磨损平衡机制好理解:在写入新数据时(这时并不知道到新数据是冷数据还是热数据),直接挑选年轻力壮的闪存块,这样就避免了一直往年长的闪存块上写入数据,闪存块的擦写次数能保持一个比较均衡的值。静态磨损平衡怎么理解呢?由于数据在写入时SSD不知道哪些数据是冷数据,哪些数据是热数据,要经过一段时间的使用才能判断出来,举个极端的例子,如果有10个闪存块在第一次写入数据之后再也没有动过,也就是存的冷数据,那这10个闪存块在磨损的角度来看就是很年轻的块,它还可以擦写很多次,所以为了不浪费这些闪存块的擦写次数能力,SSD在后台将这里面的冷数据移动到年老的闪存块里,同时还降低了这些年老闪存块继续被擦的发生几率,所以不仅要有写入时的动态磨损平衡机制,还需要后台的静态静态磨损平衡机制。

固件具体做静态磨损平衡的时候,一般使用GC机制来做,只不过它挑选源闪存块时,不是挑选有效数据最小的闪存块,而是挑选冷数据所在的闪存块。其他和GC差不多,即读取源闪存块上的有效数据,然后把它写到擦写次数相对大的闪存块上去。

磨损平衡机制有可能会导致冷数据和热数据混在一个闪存块上,在做GC的时候,由于冷数据掺杂其中(冷数据由于不经常被用户更改,这些数据往往是有效数据),这些冷数据就可能经常地从一个闪存块搬到另外一个闪存块,然后从另外一个闪存块再搬到别的闪存块上去,长此以往,引入了不少额外的写,导致写放大增大。为了解决此问题,通常做静态磨损平衡的时候,用专门的闪存块来放冷数据,即不与用户或者GC写入同一个闪存块。这样冷数据就单独写在某些闪存块上,它们一般不会挑选为GC的源闪存块,也就避免了这些冷数据的频繁搬移。它只有在下一次需要做静态磨损平衡的时候,才会从一个闪存块搬到另外一个闪存块。

不同的SSD有不同的静态磨损平衡做法。如果不在乎写放大(EC预算够大,不差钱),也不在乎冷数据搬移导致的性能下降,那么冷热数据混在一起就一起,毕竟实现简单(不需要另外管理静态磨损平衡的闪存块);相反,如果对写放大比较敏感的话,那么最好还是冷热数据分开。

文章参考自《深入浅出SSD:固态存储核心技术、原理与实战SSDFans》。


http://www.ppmy.cn/news/382723.html

相关文章

蜂鸣器制作“ 孤勇者 ”音乐

文章目录 前言一、蜂鸣器1. 简介2. 无源蜂鸣器工作原理3. 仿真电路 二、孤勇者乐谱三、程序设计总结 前言 本节为利用蜂鸣器通过调制不同音频,制作出“孤勇者”音乐。 一、蜂鸣器 1. 简介 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电&…

zeppelin(齐柏林)的配置和使用

查看zeppelin的端口号 [rootlocalhost ~]# vi /usr/hdp/share/hst/activity-explorer/conf/zeppelin-site.xml <property> <name>zeppelin.server.port</name> <value>9060</value> <description>Server port.</description&g…

柏林噪声与MC

柏林噪声与MC 引入 暑假入门Unity后打算做一个类MC的游戏。大家都知道&#xff0c;MC地形几乎是“无限”生成的(实际上有一个特别大的上限值)&#xff0c;人工制作如此庞大的地图必然不现实&#xff0c;内存也无法容纳这么多方块。因此&#xff0c;地形的生成必须得依靠算法实…

雷柏M300G使用体验

1年半前买的鼠标&#xff0c;使用频率比较高&#xff0c;当做工作电脑的鼠标使用的&#xff0c;后来坏了&#xff0c;感觉好像绿灯和蓝灯一直亮&#xff0c;连接电脑没反应&#xff0c;换了电池也没用&#xff0c;反复重启也没用&#xff0c;那个模式切换键也没反应&#xff0c…

(三)ElasticSearch核心知识理解(目录结构,索引,RESTful)

1.ElasticSearch目录结构 bin&#xff1a;包含 Elasticsearch 的可执行文件&#xff0c;如 elasticsearch&#xff08;用于启动 Elasticsearch&#xff09;、elasticsearch-plugin&#xff08;用于管理插件&#xff09;等。 config&#xff1a;包含 Elasticsearch 的配置文件。…

Linux---网络传输命令(ping、wget、curl)

1. ping命令 执行 ping 指令会使用 ICMP 传输协议&#xff0c;发出要求回应的信息&#xff0c;若远端主机的网络功能没有问题&#xff0c; 就会回应该信息&#xff0c;因而得知该主机运作正常。 语法&#xff1a;ping [参数] IP名或主机名 参数包括&#xff1a; 注意&#…

Linux常用指令和知识

ls 显示工作目录底下的所有文件/文件夹 使用命令ls, 会直接显示HOME目录下的所有文件 如果不加任何参数,那么ls指定的目录是初始的HOME目录(因为初始的工作目录为HOME目录): 使用ls / 会显示根目录底下的所有文件 如何查看根目录: 三个参数: -a -h -l -a 选项表示all的意思,列…

【从零开始玩量化19】量化数据处理全流程

工欲善其事&#xff0c;必先利其器 本文总结我认为好用的量化数据工具&#xff0c;工具基本都使用python语言。本文只做系统性总结归纳&#xff0c;每个工具的具体用法&#xff0c;请参看各工具主页链接。 1. 数据获取 这是一切的源头&#xff0c;所以我们需要功能强大且稳定…