SSD的基础知识介绍

固态硬盘,英文名Solid State Disk或Solid State Drive,是一种以存储器作为永久性存储器的电脑存储设备。虽然SSD已不是使用“碟盘”来记存数据,也没有用于“驱动”的马达,但是人们依照命名习惯,仍然称为固态硬盘或固态驱动器。固态硬盘分易失性与非易失性两种,我们着重研究更适合作为传统硬盘替代品的非易失性固态硬盘。非易失性固态硬盘中数据的存取主要由NAND Flash及其主控芯片来实现,没有活动的机械部件,为纯芯片结构。
一,SSD的历史背景

1967.贝尔实验室的韩裔工程师姜大元和华裔工程师施敏发明了浮栅晶体管(Floating Gate Transistor) .

20世纪70年代,出现以RAM(内存芯片)为组装的SSD.缺点:体积大,容量小,掉电丢失数据.

1999年,BiTMICRO发布18GB的闪存SSD. RAM逐渐被闪存替代.

2003年,SSD开始被存储行业所熟知,各大存储厂商开始研究SSD.

2006年,三星发布32G的SSD,NextCom推出以SSD为存储的笔记本.

2007年,SSD的读写带宽和随机IOPS性能超越HDD,SSD和HDD的竞争正式开始.

2008年,全球SSD厂商突破100家,SanDisk成为全球SSD领头羊.

2009年,SSD容量超越HDD,各大厂商开始推出以TB为容量的SSD.

2010年,全球SSD市场达到10亿美元.企业级以SLC为主,消费级开始走向MLC.

2013年,企业级PCIE的SSD问世,容量大,速度快,数据掉电保护,SSD开始在协议上引发技术革命.

2015年,东芝发布了48层16GB的3D闪存样品,西部数据190亿美金收购Sandisk.

2016年,企业级SSD开始出现快速的技术更新,支持PCIE 4.0的SSD问世.

2020年,全球SSD出货量超越了HDD,HDD开始走向大容量发展的道路.

二 SSD常见的形态

NAND是半导体存储颗粒的一种(还有其他的种类,比如NOR), 简单来说,NAND可以视作是由很多很多个电容器组成的集成电路。制造NAND和制造CPU处理器类似,都是使用高纯度硅,切割成晶圆之后使用光刻机和化学溶剂将设计好的电路蚀刻上去,然后用金属材料“镶嵌”制作而成的。这样做出来的是一个布满NAND芯片的晶圆。将晶圆切开,然后对切割后的芯片精心挑选测试,封装后就可以出厂了。虽然整个工艺虽然和制造CPU类似,但是电路等方面还是简单不少的

常见的企业级SSD有SATA,NVME这两种。随着PCIE的不断提速,nvme的SSD产量越来越高,SATA的SSD在逐步减少。本文重点介绍NVME的SSD
在这里插入图片描述
三 SSD的内部结构

SSD主要由控制单元和存储单元(当前主要是FLASH闪存颗粒)组成,控制单元包括SSD控制器、主机接口、DRAM等,存储单元主要是NAND FLASH颗粒。
在这里插入图片描述
在这里插入图片描述
主机接口:主机访问SSD的协议和物理接口,常用的有SATA、SAS和PCIE等。

SSD控制器:负责主机到后端介质的读写访问和协议转换,表项管理、数据缓存及校验等,是SSD的核心部件。

DRAM:FTL表项和数据的缓存,以提供数据访问性能。

NAND FLASH:数据存储的物理器件载体。
四 SSD的读写原理

SSD的内部构造比较简单,一般是主控和NAND这两大部分。下面我看看SSD是如何工作的

SSD主控通过若干个通道(channel)并行操作多块FLASH颗粒,类似RAID0,大大提高底层的带宽。举个例子,假设主控与FLASH颗粒之间有8个通道,每个通道上挂载了一个闪存颗粒,HOST与FLASH之间数据传输速率为200MB/s。该闪存颗粒Page大小为8KB,FLASH page的读取时间为Tr=50us,平均写入时间为Tp=800us,8KB数据传输时间为Tx=40us。那么底层读取最大带宽为(8KB/(50us+40us))*8 = 711MB/s,写入最大带宽为 (8KB/(800us+40us))*8 = 76MB/s。从上可以看出,要提高底层带宽,可以增加底层并行的颗粒数目,也可以选择速度快的FLASH颗粒(或者让速度慢的颗粒变快,比如MLC配成SLC使用)。

我们以8通道为例,来讲讲HOST怎么读写SSD。主控通过8通道连接8个FLASH DIE,为方便解释,这里只画了每个DIE里的一个Block,其中每个小方块表示一个Page (假设大小为4KB)。
在这里插入图片描述
HOST写入4KB数据

HOST继续写入16KB数据

HOST继续写入,最后整个Block都写满

当所有Channel上的Block都写满的时候,SSD主控会挑选下一个Block以同样的方式继续写入。

HOST是通过LBA(Logical Block Address,逻辑地址块)访问SSD的,每个LBA代表着一个Sector(一般为512B大小),操作系统一般以4K为单位访问SSD,我们把HOST访问SSD的基本单元叫用户页(Host Page)。而在SSD内部,SSD主控与FLASH之间是FLASH Page为基本单元访问FLASH的,我们称FLASH Page为物理页(Physical Page)。HOST每写入一个Host Page, SSD主控会找一个Physical Page把Host数据写入,SSD内部同时记录了这样一条映射(Map)。有了这样一个映射关系后,下次HOST需要读某个Host Page 时,SSD就知道从FLASH的哪个位置把数据读取上来。

SSD内部维护了一张映射表(Map Table),HOST每写入一个Host Page,就会产生一个新的映射关系,这个映射关系会加入(第一次写)或者更改(覆盖写)Map Table;当读取某个Host Page时, SSD首先查找Map Table中该Host Page对应的Physical Page,然后再访问Flash读取相应的Host数据。

由于闪存页和逻辑页大小不同,一般前者大于后者,所以实际上不会是一个逻辑页对应一个物理页,而是若干个逻辑页写在一个物理页中,逻辑页其实是和子物理页一一对应的。

一张映射表有多大呢?

这里假设我们有一个256GB的SSD,以4KB大小的逻辑页为例,那么用户空间一共有64M(256GB/4KB)个逻辑页,也就意味着SSD需要有能容纳64M条映射关系的映射表。映射表中的每个单元(entry)存储的就是物理地址(Physical Page Address),假设其为4字节(32bits),那么整个映射表的大小为64M×4B=256MB。一般来说,映射表大小为SSD容量大小的千分之一。

准确来说,映射表大小是SSD容量大小的1/1024。前提条件是:映射页大小为4KB,物理地址用4Byte表示。这里假设了SSD内部映射粒度等于逻辑页大小,当然它们可以不一样。对于绝大多数SSD,我们可以看到上面都有板载DRAM,其主要作用就是存储这张映射表,如图4-7所示。在SSD工作时,全部或绝大部分的映射表都可以放在DRAM上,映射关系可以快速访问。
在这里插入图片描述
对绝大多数SSD,我们可以看到上面都有板载DRAM,其主要作用就是用来存储这张映射表。也有例外,比如基于Sandforce主控的SSD,它并不支持板载DRAM,那么它的映射表存在哪里呢?SSD工作时,它的绝大部分映射是存储在FLASH里面,还有一部分存储在片上RAM上。当HOST需要读取一笔数据时,对有板载DRAM的SSD来说,只要查找DRAM当中的映射表,获取到物理地址后访问FLASH从而得到HOST数据.这期间只需要访问一次FLASH;而对Sandforce的SSD来说,它首先看看该Host Page对应的映射关系是否在RAM内,如果在,那好办,直接根据映射关系读取FLASH;如果该映射关系不在RAM内,那么它首先需要把映射关系从FLASH里面读取出来,然后再根据这个映射关系读取Host数据,这就意味着相比有DRAM的SSD,它需要读取两次FLASH才能把HOST数据读取出来,底层有效带宽减半。对HOST随机读来说,由于片上RAM有限,映射关系Cache命中(映射关系在片上RAM)的概率很小,所以对它来说,基本每次读都需要访问两次FLASH,所以我们可以看到基于Sandforce主控的SSD随机读取性能是不太理想的。
在这里插入图片描述
在这里插入图片描述
当整个SSD写满后,从用户角度来看,如果想写入新的数据,则必须删除一些数据,然后腾出空间再写。用户在删除和写入数据的过程中,会导致一些Block里面的数据变无效或者变老。由于闪存不能覆盖写,闪存块需擦除才能写入。主机发来的某个数据块,它不是写在闪存固定位置,SSD可以为其分配任何可能的闪存空间写入。因此,SSD内部需要FTL这样一个东西,完成逻辑数块到闪存物理空间的转换或者映射。

Block中的数据变老或者无效,是指没有任何映射关系指向它们,用户不会访问到这些FLASH空间,它们被新的映射关系所取代。比如有一个Host Page A,开始它存储在FLASH空间的X,映射关系为A->X。后来,HOST重写了该Host Page,由于FLASH不能覆盖写,SSD内部必须寻找一个没有写过的位置写入新的数据,假设为Y,这个时候新的映射关系建立:A→Y,之前的映射关系解除,位置X上的数据变老失效,我们把这些数据叫垃圾数据。
在这里插入图片描述
随着HOST的持续写入,FLASH存储空间慢慢变小,直到耗尽。如果不及时清除这些垃圾数据,HOST就无法写入。SSD内部都有垃圾回收机制,它的基本原理是把几个Block中的有效数据(非垃圾数据,上图中的绿色小方块表示的)集中搬到一个新的Block上面去,然后再把这几个Block擦除掉,这样就产生新的可用Block了。

上图中,Block x上面有效数据为A,B,C,Block y上面有效数据为D,E,F,G,红色方块为无效数据。垃圾回收机制就是先找一个未写过的可用Block z,然后把Block x和Block y的有效数据搬移到Block z上面去,这样Block x和Block y上面就没有任何有效数据,可以擦除变成两个可用的Block。

一块刚买的SSD,你会发现写入速度很快,那是因为一开始总能找到可用的Block来进行写入。但是,随着你对SSD的使用,你会发现它会变慢。原因就在于SSD写满后,当你需要写入新的数据,往往需要做上述的垃圾回收:把若干个Block上面的有效数据搬移到某个Block,然后擦掉原先的Block,然后再把你的Host数据写入。这比最初单纯的找个可用的Block来写耗时多了,所以速度变慢也就可以理解了。

还是以上图为例。假设HOST要写入4KB数据 (H) ,由于当前可用Block过少,SSD开始做垃圾回收。从上图可以看出,对Block x来说,它需要把Page A,B,C的数据读出并写入到Block z,然后Block x擦除用于HOST数据写入。从Host角度,它只写了4KB数据,但从SSD内部来说,它实际写入了4个Page(Page A, B, C写入Block z,4KB数据H写入到Block x)

2008年,Intel公司和SiliconSystems公司(2009 年被西部数字收购)第一次提出了写入放大(Write Application)并在公开稿件里用到这个术语。

在上面例子中,Host写了4KB数据,闪存写了4个4KB数据,所以上面例子中写放大为4。

假设一个SSD,底下所有FLASH容量为256GB,开放给用户使用也是256GB,那么问题就来了。想象一个场景,HOST持续写满整个SSD,接着删除一些文件,写入新的文件数据,试问新的数据能写入吗?在SSD底层,如果要写入新的数据,必须要有可用的空闲Block,但由于之前256GB空间已经被HOST数据占用了,根本就没有空闲Block来写你的数据。不对,你刚才不是删了一些数据吗?你可以垃圾回收呀。不错,但问题来了,在上面介绍垃圾回收的时候,我们需要有Block z来写回收来的有效数据,我们这个时候连Block z都找不到,谈什么垃圾回收?所以,最后是用户写失败。

上面这个场景至少说明了一点,SSD内部需要预留空间(需要有自己的小金库,不能工资全部上缴),这部分空间HOST是看不到的。这部分预留空间,不仅仅用以做垃圾回收,事实上,SSD内部的一些系统数据,也需要预留空间来存储,比如前面说到的映射表(Map Table),比如SSD固件,以及其它的一些SSD系统管理数据。

一般从HOST角度来看,1GB= 1,000,000,000Byte,从底层FLASH角度,1GB=1102410241024Byte。256GB FLASH 为256(2^30) Byte,而一般说的256GB SSD 容量为256*(10^9) Byte,这样,天然的有(256*(230)-256*(109))/(256*(10^9)) = 7.37%的OP。如果把256GB Flash容量的SSD配成240GB的,那么它的OP是多大呢? (256*(230)-240*(109))/(240*(10^9)) = 14.5%

除了满足基本的使用要求外,OP变大有什么坏处或者好处呢?坏处很显然,用户能使用的SSD容量变小。那么好处呢?

回到垃圾回收原理来。

再看一下这张图。回收Block x,上面有3个有效Page,需要读写3个Page完成整个Block的回收;而回收Block y时,则需要读写4个有效Page。两者相比,显然回收Block x比回收Block y快一些。说明一个简单的道理:一个Block上有效的数据越少(垃圾数据越多),则回收速度越快。

256GB FLASH配成256GB的SSD (OP = 7.37%), 意味着256*(10^9)的有效数据写到 256*(230)的空间,每个Block上面的平均有效数据率可以认为是256*(109)/256*(2^30) = 93.1%。

如果配成240GB的SSD,则意味着240*(109)的有效数据写到256*(230)的空间,每个Block的平均有效数据率为240*(109)/256*(230) = 87.3%。 OP越大,每个Block平均有效数据率越小,因此我们可以得出的结论:

OP越大,垃圾回收越快,写放大越小。这就是OP大的好处。

写放大越小,意味着写入同样多的HOST数据,写入到FLASH中的数据越少,也就意味着FLASH损耗越小。FLASH都是有一定寿命的,它是用P/E数 (Program/Erase Count)来衡量的。如果SSD集中对某几个Block进行擦写,那么这几个Block很快就寿命耗尽。比如在用户空间,有些数据是频繁需要更新的,那么这些数据所在Block就需要频繁的进行擦写,这些Block的寿命就可能很快的耗尽。相反,有些数据用户是很少更新的,比如一些只读文件,那么这些数据所在的Block擦写的次数就很少。随着用户对SSD的使用,就会形成一些Block有很高的PE数,而有些Block的PE数却很低的。这不是我们想看到的,我们希望所有Block的PE数都应该差不多,就是这些Block被均衡的使用。在SSD内部,有一种叫磨损平衡(Wear Leveling,WL)的机制来保证这点。

一个闪存块寿命有多长呢?从SLC十几万的擦写次数,到MLC几千的擦写次数,然后到TLC的一两千次甚至几百次擦写次数,随着闪存工艺不断向前推,闪存的寿命越来越短,SSD对磨损平衡的处理要求也越来越高,如下所示。
在这里插入图片描述
WL有两种算法:动态WL和静态WL。所谓动态WL,就是在使用Block进行擦写操作的时候,优先挑选PE 数低的;所谓静态WL,就是把长期没有修改的老数据(如前面提到的只读文件数据)从PE数低的Block当中搬出来,然后找个PE 数高的Block进行存放,这样,之前低PE数的Block就能拿出来使用

假设有一个SSD里有4096个闪存块,擦写次数为10000次,其中2.5%为备用区。现在我写入三个文件,每个文件占据了50个块的容量,每10分钟更新其中一个文件,如果没有WL的话,那就是全盘只有前200(3个数据块3*50,+ 一个搬运数据块50)个块在做擦写操作了。那么可以计算它的寿命大概是
在这里插入图片描述
如果做了WL呢
在这里插入图片描述
可以看到 做磨损平衡之后。SSD的寿命能延长很多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/59227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

源码角度看待线程池的执行流程

文章目录 前言一、线程池的相关接口和实现类1.Executor接口2.ExecutorService接口3.AbstractExecutorService接口4.ThreadPoolExecutor 实现类 二、ThreadPoolExecutor源码解析1.Worker内部类2.execute()方法3.addWorker()方法 总结 前言 线程池内部维护了若干个线程&#xff…

RabbitMq深度学习

什么是RabbitMq? RabbitMQ是一个开源的消息队列中间件,它实现了高级消息队列协议(AMQP)。它被广泛用于分布式系统中的消息传递和异步通信。RabbitMQ提供了一种可靠的、可扩展的机制来传递消息,使不同的应用程序能够相互之间进行…

Llama-2大模型本地部署研究与应用测试

最近在研究自然语言处理过程中,正好接触到大模型,特别是在年初chatgpt引来的一大波AIGC热潮以来,一直都想着如何利用大模型帮助企业的各项业务工作,比如智能检索、方案设计、智能推荐、智能客服、代码设计等等,总得感觉…

C语言网络编程实现广播

1.概念 如果同时发给局域网中的所有主机,称为广播 我们可以使用命令查看我们Linux下当前的广播地址:ifconfig 2.广播地址 以192.168.1.0 (255.255.255.0) 网段为例,最大的主机地址192.168.1.255代表该网段的广播地址(具体以ifcon…

开源的经济影响:商业与社区的平衡

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

ChatGPT 一条命令总结Mysql所有知识点

想学习Mysql的同学,可以使用ChatGPT直接总结mysql所有的内容与知识点大纲 输入 总结Mysql数据库所有内容大纲与大纲细分内容 ChatGPT不光生成内容,并且直接完成了思维导图。 AIGC ChatGPT ,BI商业智能, 可视化Tableau, PowerBI, FineReport, 数据库Mysql Oracle, Offi…

K 次取反后最大化的数组和【贪心算法】

1005 . K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后,返回数组 可能…

word 调整列表缩进

word 调整列表缩进的一种方法,在试了其他方法无效后,按下图所示顺序处理,编号和文字之间的空白就没那么大了。 即右键word上方样式->点击修改格式->定义新编号格式->字体->取消勾选 “……对齐到网格”->确定

AndroidStudio3.5.2修改项目项目包名

公司项目要打造成产品进行演示,需要更换不同的包名进行安装在同一设备上,即所谓的马甲包 更改步骤基本一样 https://blog.csdn.net/qq_35270692/article/details/78336049 需要注意的是,按照上边的步骤修改完后,如果项目中有数据…

机器学习基础之《分类算法(4)—案例:预测facebook签到位置》

一、背景 1、说明 2、数据集 row_id:签到行为的编码 x y:坐标系,人所在的位置 accuracy:定位的准确率 time:时间戳 place_id:预测用户将要签到的位置 3、数据集下载 https://www.kaggle.com/navoshta/gr…

TCP数据报结构分析(面试重点)

在传输层中有UDP和TCP两个重要的协议,下面将针对TCP数据报的结构进行分析 关于UDP数据报的结构分析推荐看UDP数据报结构分析(面试重点) TCP结构图示 TCP报头结构的分析 一.16位源端口号 源端口表示发送数据时,发送方的端口号&am…

Flutter开发- iOS 问题CocoaPods not installed or not in valid state

解决问题方案: 1、先检查本机CocoaPods是否安装,通过gem list 查看是否安装 打开终端,执行gem list,出现图中的数据即为已安装。未安装看第4 步 2、已经安装了CocoaPods,还出现了图中的提示,你可能已经猜…

java内存模型讨论及案例分析

常用内存选项 -Xmx: 最大堆大小 -Xms:最小堆大小 -Xss :线程堆栈大小,默认1M 生产环境最好保持 Xms Xmx java内存研究 内存布局 可见: 堆大小 新生代 老年代,新生代EFrom SurvivorTo Survivor。新…

Particle Life粒子生命演化的MATLAB模拟

Particle Life粒子生命演化的MATLAB模拟 0 前言1 基本原理1.1 力影响-吸引排斥行为1.2 距离rmax影响 2 多种粒子相互作用2.1 双种粒子作用2.1 多种粒子作用 3 代码 惯例声明:本人没有相关的工程应用经验,只是纯粹对相关算法感兴趣才写此博客。所以如果有…

【已解决】Java 后端使用数组流 Array.stream() 将数组格式的 Cookie 转换成字符串格式

🎉工作中遇到这样一个场景:远程调用某个接口,该接口需要用户的 Cookie 信息进行权限认证,认证通过之后才可以打通并返回数据。 在后端拿到 httpServletRequest 后,调用 getCookies() 方法,返回的是一个 Coo…

WPF基础入门-Class6-WPF通知更改

WPF基础入门 Class6-WPF通知 1、显示页面&#xff1a; <Grid><StackPanel><TextBox Text"{Binding Name}"></TextBox><TextBox Text"{Binding Title}"></TextBox><Button Command"{Binding ShowCommand}&qu…

el-table动态生成多级表头的表格(js + ts)

展示形式&#xff1a; 详细代码&#xff1a; &#xff08;js&#xff09; <template><div><el-table :data"tableData" style"width: 100%"><el-table-column label"题目信息" align"center"><el-table-…

【C++】C++11的新特性(上)

引入 C11作为C标准的一个重要版本&#xff0c;引入了许多令人振奋的新特性&#xff0c;极大地丰富了这门编程语言的功能和表达能力。本章将为您介绍C11的一些主要变化和改进&#xff0c;为接下来的章节铺垫。 文章目录 引入 一、列表初始化 1、1 {} 初始化 1、2 std::initiali…

java 桥接模式

桥接模式 桥接模式简介桥接模式的实现总结 桥接模式简介 桥接模式&#xff08;Bridge&#xff09;是将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。它是一种对象结构型模式&#xff0c;又称为柄体(Handle and Body)模式或接口(Interfce)模式。 桥接模式基于…

正则表达式 之 断言详解

正则表达式的先行断言和后行断言一共有 4 种形式&#xff1a; (?pattern) 零宽正向先行断言(zero-width positive lookahead assertion)(?!pattern) 零宽负向先行断言(zero-width negative lookahead assertion)(?<pattern) 零宽正向后行断言(zero-width positive lookb…