SSD基础知识 您所在的位置:网站首页 121gb闪存是多少ssd SSD基础知识

SSD基础知识

2024-07-14 03:04| 来源: 网络整理| 查看: 265

转载:https://blog.csdn.net/qq_22037755/article/details/47187053

LBA(逻辑区块地址)及PBA(物理区块地址) LBA,全称为Logical Block Address,是PC数据存储装置上用来表示数据所在位置的通用机制,我们最常见到使用它的装置就是硬盘。LBA可以指某个数据区块的地址或者某个地址上所指向的数据区块。打个比方来说,LBA就等于我们平常使用的门牌地址(如:中华人民共和国广东省广州市中山四路26号)。而PBA全称为Physics Block Address,相对于LBA来说,它就如GPS定位所使用的经纬度(如上面地址的经纬度为:东经:113°16′40.0621″,北纬:23°07′37.6129″)。 在HDD上,由于HDD的数据可以直接覆盖,所以LBA和PBA的关系是1:1对应,不会变更,即LBA=PBA。但在SSD上,这种关系就变得复杂了,原因是SSD使用的存储介质NAND闪存有需要先擦除才能再写入,和读写以页为单位,擦除以块(多个页组成)为单位的特性,导致LBA和PBA的关系不再是固定不变的。因此SSD就需要一层叫做FTL的东西来作转换,以配合现有的文件系统。(FTL在后面将会独立介绍) NAND闪存的擦除/写入关系请参考下图: (闪存页大小一般为4KB或8KB,块一般有128至256页) 由于NAND闪存的特性,SSD的主控制器是使用LBA和PBA的映射表来管理闪存的。当有需更新的数据要写入时,主控会把新数据写入到空白的闪存空间(已擦除状态的)内,然后更新映射表数据,把LBA指向新的PBA。原来的PBA就成了无效数据,这个PBA若要再次写入数据就需先进行擦除的操作。但这里会产生一个问题,闪存颗粒的寿命是按Program/Erase(编程/擦除,由于闪存不能覆盖,写入前必须擦除,所以习惯叫编程,不过为方便大家阅读,后面我们依然叫写入)次数计算的,MLC(多阶存储单元闪存)的寿命一般在1000-10000次,SLC(单阶存储单元闪存)则在10万次左右。 FTL(Flash translation layer)闪存转换层 前面说过,闪存的读写单位为页,而页的大小一般为4KB或8KB,但我们的操作系统读写数据是按HDD的扇区尺寸进行的(512Byte(字节)),更麻烦的是闪存擦除以块作单位,而且未擦除就无法写入,这导致操作系统现在使用的文件系统根本无法管理SSD,需要更换更先进、复杂的文件去解决这个问题,但这样就会加重操作系统的负担。 而为了不加重操作系统的负担,SSD采用软件的方式把闪存的操作虚拟成磁盘的独立扇区操作,这就是FTL。因FTL存在于文件系统和物理介质(闪存)之间,操作系统只需跟原来一样操作LBA即可,而LBA到PBA的所有转换工作,就全交由FTL负责。(请看下图) FTL算法,其实就是一种LBA到PBA的映射。当文件系统发送指令要写入或者更新一个特定的逻辑页时,FTL实际上是把数据写入到一个不同的空闲物理页并更新映射表(LBA和PBA的关联数据),并把这个页上包含的“旧数据”标记为“无效”(更新后的数据已经写入新的PBA,旧地址的数据自然就失效了)。正是因为FTL的存在,操作系统才能把SSD当成HDD那样操作,因此FTL转换的性能也就直接影响SSD的性能表现。 我们现在看下图,假设在page0上写入数据(物理地址n),接下来写入数据到page1(物理地址n+1)。接着page0数据被更新,但是更新后的数据并不是覆盖上去,FTL会把它写入到地址(n+2)上,然后标记(地址n)为“无效”。经过多次这样的操作后,这个块上就会装满了许多“有效”及“无效”的数据。如果要再次写入到这个块,就需要先擦除整个块的数据,当然就需要先把所有“有效”的数据复制到另外的空白块上再进行擦除。这样的操作就是GC(即垃圾回收,相关知识在后面会独立介绍)。

WL(Wear leveling)磨损平衡 前面说过,闪存寿命是以P/E次数来计算的,而WL就是确保闪存内每个块被写入的次数相等的一种机制。若没有这个机制,SSD内的闪存颗粒就无法在同一时间内挂掉,那对用户来说就是灾难。 会出现这种情况的原因在于,用户在LBA空间里的数据更新速度是不同的,有部分是经常需要更新,而有些却长期不需要变更,因此若没有WL,很显然那些经常被更新的数据所在的闪存寿命会首先被消耗完毕,而不怎么需要变更的数据所在的闪存损耗就要小得多。为了避免出现这种状况,便需要WL这个机制来保持SSD内的每个闪存颗粒的磨损程度在相对一致的状态且最后同时报废,但由于颗粒本身也有其个体差异,因此这里说的也只是最理想的状态。 WL技术依赖于LBA和PBA的转换:也就是说,每次主机上应用程序请求相同的逻辑页地址时,闪存控制器动态的映射逻辑页地址到另一个不同的物理页地址,并把这个映射的指向存放在一个特定的“映射表”里。而之前过期的物理页地址就被标记为“无效”并等待随后的擦除操作。这样一来,所有的物理块就能被控制在一个相同磨损范围,并同时“老化”。(WL的实现机制请看下图) WL算法有动态及静态两种,简单来说动态WL是每次都挑最年轻的闪存块使用,老闪存块尽量不用。静态WL就是把长期没有修改的老数据从年轻的闪存块里搬出来,重新找个最老的闪存块存放,这样年轻的闪存块就能再次被经常使用,概念很简单,只是这么一句话,但实现起来却非常的复杂,特别是静态WL,而且也只有静态WL才算是真正的全盘WL。(无WL、动、静态WL对寿命的影响请看下图)

GC(Garbagecollection)垃圾回收 在前面向大家讲解FTL时,我们提到了GC的操作,所谓GC就是把一个闪存块里的‘有效’页数据复制到一个‘空白’块里,然后把这个块完全擦除。GC是SSD里的一个非常关键的操作,其效率对性能有决定性影响。闪存块里‘有效’页的数量对GC效率有决定性的影响,因数量越少,需要复制的页就越少, 花费的时间也越少,效率就高了。(GC操作参考下图) 请看下图,把X块和Y块里的“有效”页复制到N块里,然后擦除X和Y以作备用的“空白块”。 由前面的WL机制可知,WL的执行需要有“空白”块来写入更新后的数据。当可以直接写入数据的备用“空白块”数量低于一个阈值(厂商在主控固件里设置,一般为全盘闪存容量写满后),那么SSD主控就会把包含“无效”数据的块里所有“有效”数据合并起来放到新的“空白”块里,并删除“无效”数据块来增加备用的“空白块”数量。这个操作就是SSD的GC机制。 由于GC会对SSD产生大量负载,因此GC可分闲置GC及被动GC。闲置GC就是让SSD主控在系统闲置时‘提前’进行GC操作,产生一定数量的‘空白’块,让GC操作不至于明显影响用户使用感受,但缺点是会因此造成额外的WA(写入放大,相关知识在后面会独立介绍),因为刚GC的‘有效’数据可能会因为用户更新而变‘无效’。被动GC则是所有SSD一定具备的,SSD主控性能对被动GC效率有决定性影响,因为此时SSD需要同时进行GC及用户要求的数据操作,主控性能不足就会让用户发觉SSD的性能下降。 Trim指令的效果就是直接产生更多的‘无效’页数据,减轻GC的压力,从而减少用户发觉SSD性能下降的机会。Trim相关知识后面会独立介绍。 OP(Over-provisioning)预留空间 SSD上的OP指的是用户不可操作的容量,大小为实际容量减去用户可用容量,OP区域一般被用于优化操作如:WL,GC和坏块映射等。 OP一般分三层(见下图)。第一层容量固定为SSD标称容量的7.37%,这是因为标称容量采用千进制为单位,而NAND颗粒容量单位为1024进制,两者正好相差约7.37%。这部分空间被默认用于作OP。第二层OP是否存在及容量大小取决于厂商设置。第三层OP是用户在日常使用中可以分配的,像Fusion-IO公司还给其用户提供工具让他们自行调节大小以满足不同的耐用度及性能要求,一般用户也可以自己在初次分区的时候,不把所有的SSD容量都分满来达到相同目的,此处有一点要注意,若非首次分区就留出空间,必须要先进行全盘擦除,否则没有效果。 虽然OP会减少SSD的可用容量,但有减少WA、提高寿命、性能的正面作用。请看下图:两个相同的64G SSD,左边的分区50G,右边的全部容量分区。格式化后容量分别为:46G和59G左右。 我们知道在操作系统下,要写入共59G的数据时,左边的盘必须删除13G的‘无效’数据才行。右边的盘不需擦除就能写入所有59G数据,由SSD映射表的操作方式可知,删除后继续写入的数据在物理上会继续写入整个盘(写入OP1和OP2),在LBA上会覆盖被删除数据的地址。也就是说,同样写入59G数据,左边的盘已经包含了13G“无效”数据了。(那些被重映射到预留空间的数据,原地址数据就是“无效”、“过期”的)。所以说图中SSD里LBA上数据“有效”的机会比右边要少,因为LBA容量小(分区小),所以在做垃圾回收处理时,需要复制的“有效”数据也少了,自然效率就提高了。 一般来说,建议在不支持Trim或对SSD的性能有较高要求的时候,如数据库等类的应用,增加一定比例的第三层OP容量(此空间需要先做HDD ERASE,保证没有被使用过),可以很好的起到保持速度,提高寿命的作用。(如必须用SSD组建RAID时,强烈建议留部分OP容量以弥补没有Trim产生的影响。) Trim(有翻译为:修剪,但非正式翻译) Trim,其实是一个ATA指令,并无正式中文名称,操作系统发送此指令给SSD主控,以通知它哪些数据占用的地址是‘无效’的。 在讲解Trim的重要性前,先说一点文件系统的相关知识。当我们在操作系统中删除一个文件时,系统并没有真正删掉这个文件的数据,它只是把这些数据占用的地址标记为‘空’,即可以覆盖使用。但这只是在文件系统层面的操作,硬盘本身并不知道那些地址的数据已经‘无效’,除非系统通知它要在这些地址写入新的数据。在HDD上本无任何问题,因为HDD允许覆盖写入,但到SSD上问题就来了,我们都已知道闪存不允许覆盖,只能先擦除再写入,要得到‘空闲’的闪存空间来进行写入,SSD就必须进行GC操作。在没有Trim的情况下,SSD无法事先知道那些被‘删除’的数据页已经是‘无效’的,必须到系统要求在相同的地方写入数据时才知道那些数据可以被擦除,这样就无法在最适当的时机做出最好的优化,既影响GC的效率(间接影响性能),又影响SSD的寿命。 大家要牢记,Trim只是一个指令,它让操作系统通知SSD主控某个页的数据已经‘无效’后,任务就已完成,并没有更多的操作。Trim指令发送后,实际工作的是GC机制。Trim可减少WA的原因在于主控无需复制已被操作系统定义为‘无效’的数据(Trim不存在的话,主控就不知道这些数据是无效的)到‘空闲’块内,这代表要复制的‘有效’数据减少了,GC的效率自然也就提高了,SSD性能下降的问题也就减弱了。其实Trim的意义在于它能大量减少“有效”页数据的数量,大大提升GC的效率。特别是消费级的SSD由于一般OP空间较少,因此相对于有大量OP空间的企业级SSD来说,Trim显得尤其重要。 Trim的作用可参考下图。 Trim指令只有在操作系统进行删除、格式化等操作时候才会发送。Trim指令目前还不支持发送给RAID阵列中的SSD。(操作系统下进行的软件RAID可以支持)。 Trim的支持需要3个要素: 1.SSD主控制器和当前搭配的固件需要支持Trim命令接收。 2.当前操作系统需要支持Trim指令发送。(Win7/2008R2及后续版本) 3.当前使用的磁盘驱动程序必须支持Trim命令传输。 只有同时满足以上3个条件,才能做到系统Trim命令发送,驱动传输Trim命令,SSD固件接收到传输来的Trim命令。 Trim目前不支持以下几种情况:(可能还有更多) 1. Trim目前不支持RAID阵列中的SSD。(操作系统下进行软件RAID除外) 2. Trim目前不支持磁盘镜像文件内操作。(VM等虚拟机软件使用的虚拟磁盘文件) 3. Trim目前不支持加密的文件系统。(以防止暴露加密文件系统信息) WA(Write Amplification)写入放大 WA是闪存及SSD相关的一个极为重要的属性。由于闪存必须先擦除才能再写入的特性,在执行这些操作时,数据都会被移动超过1次。这些重复的操作不单会增加写入的数据量,还会减少闪存的寿命,更吃光闪存的可用带宽而间接影响随机写入性能。WA这个术语在2008年被Intel公司和SiliconSystems公司(于2009 年被西部数据收购)第一次提出并在公开稿件里使用。 举个最简单的例子:当要写入一个4KB的数据时,最坏的情况是一个块里已经没有干净空间了,但有无效的数据可以擦除,所以主控就把所有的数据读到缓存,擦除块,缓存里更新整个块的数据,再把新数据写回去,这个操作带来的写入放大就是: 实际写4K的数据,造成了整个块(共1024KB)的写入操作,那就是放大了256倍。同时还带来了原本只需要简单一步写入4KB的操作变成:闪存读取 (1024KB)→缓存改(4KB)→闪存擦除(1024KB)→闪存写入(1024KB),共四步操作,造成延迟大大增加,速度变慢。所以说WA是影响 SSD随机写入性能和寿命的关键因素。 以100%随机4KB来写入,目前的大多数SSD主控,在最坏的情况下WA可以达到100以上。如果是100%持续的从低LBA写入到高LBA的话,WA可以做到1,实际使用中写入放大会介于这两者之间。 用户还可以设置一定的OP来减少WA,假设你有个128G的SSD,你只分了64G 的容量使用,那最坏情况下的写入放大就能减少约3倍。 许多因素影响SSD的WA。下面列出主要的因素,以及它们如何影响WA。 1. 垃圾回收(GC)— 虽然增加了写入放大,但是速度有提升。 这个比较特殊的算法用来移动,合并,擦除闪存块来提升效率。(详见GC章节) 2. 预留空间(OP)— 减少写入放大,好。(预留空间越大,写入放大越低) 在SSD上划出部分空间留给主控做优化,是用户不能操作的空间。(详见OP章节) 3. Trim 开启后可以减少写入放大,好。 一个ATA指令,由操作系统发送给SSD主控,告诉主控哪些数据是无效的并且可以不用做垃圾回收操作。(详见Trim章节) 4. 可用容量减少写入放大,好。(可用空间越大,写入放大越低) 用户使用中没有用到的空间。(需要有Trim支持,不然不会影响写入放大。) 5. 安全擦除 Secure Erase 减少写入放大,好 ATA安全擦除命令用来清除在磁盘上的所有用户数据,这个指令会让SSD回到出厂时的性能(最优性能,最少写入放大),但是随着使用时间变长,GC操作恢复后,写入放大又会慢慢增加回来。许多软件使用ATA安全擦除指令来重置磁盘,最著名的为HDDErase。对SSD来说,重置就是(除了OP区域内的部分私有区域外的)全盘擦除操作(逻辑1),瞬间即可完成清除所有数据让SSD回到初始状态。但要注意,每操作一次,全盘寿命P/E次数减1。 6. 持续写入(Sequential writes)减少写入放大,好 理论上来说,持续写入的写入放大为1,但是某些因素还是会影响这个数值。 7. 静态/动态数据分离(Separating Static and Dynamic Data)减少写入放大,好 高端SSD主控制器支持静态和动态数据的分离处理,此操作要求SSD主控制器对LBA里经常写入(动态数据,热数据)和不经常写入(静态数据,冷数据)的数据块进行归类,因为如果块里同时包含了静态和动态数据,在做GC操作的时候会为了改写其实没必要的静态数据而增加写入放大,所以把包含静态数据的块归类后,因为不常改写,写入放大就减少了。但是迟早SSD主控会把这些静态的数据转移到别的地方来进行磨损平衡。(因为静态数据占着的数据块一直不改写,编程次数低于平均值的话,会造成颗粒磨损不平衡,违背了磨损平衡,确实非常矛盾的。) 8. 随机写入(Random writes)提高写入放大,不好 随机写入会写入很多非连续的LBA,将会大大提升写入放大。 9. 磨损平衡(WL)直接提高写入放大,不好 确保闪存的每个块被写入的次数相等的一种机制。(详见WL章节) BBM(Bad Block Management)坏块管理 不管WL算法如何高明,在使用中都会碰到一个头痛的问题,那就是坏块,所以一个SSD必须要有坏块管理机制。何谓坏块?一个闪存块里包含有不稳定的地址,不能保证读/写/擦时数据的准确性。 坏块分出厂坏块和使用过程中出现的坏块,SSD有坏块表来管理坏块。出厂坏块在上面会有标记,所以很容易就能被识别,而使用中出现的坏块就要靠主控的能力了。一般来说,越到闪存生命的后期(P/E数开始接近理论最大值),坏块就会开始大量出现。 一般来说闪存出厂都包含坏块,不过厂商有个最小有效块值(NvB-minimum number of valid blocks),以Intel的34nm MLC L63B来说,1个die(裸晶,详细解释见备注)上4,096个块里至少要有3,936个块是好的。从这上面可以知道,虽然出厂的闪存可能有坏块,但是厂商保证在正常的生命周期里,好块数量不会低于3936个块。而且每个die的第一个块地址(00h)在出厂时是必须保证完好的。(ECC后,这个块必须有效,ECC相关知识后面会有介绍)。闪存出厂前都会被执行擦除操作,厂商会在出货前会把坏块标记出来(厂商会在坏块的第一个页的SA区打上标记,SA区知识将在后面ECC部分介绍)这样坏块管理软件就能靠监测SA区标记来制作坏块表。由于在使用中会产生坏块,所以SSD的主控在每次写入/擦除/复制等操作后都要检查块的状态。对颗粒的ECC要求也要达到厂商的标准以上(主控强不强,看ECC能力也是一个参考)。坏块管理算法是必须的,坏块并不会影响好块的性能。 坏块的标记和管理: 刚出厂的颗粒内部已经被完全擦除过(全盘区块数据为FFh),坏块在出厂时也被标记上了。以MLC来说,颗粒内任何块里最后页的SA区首个字节数据非FFh的话,那就是坏块。 主控必须在每次擦除前读取一下坏块信息,因为坏块信息是可以被擦除的并且不能在擦除后恢复,所以建议不要去擦除原始的坏块信息。在读取闪存内所有的SA区域后,坏块表就被建立。纯靠自己的坏块识别方法而不使用原厂提供的SA区域坏块信息创建的坏块表是不严谨的做法,因为在原厂测试中,坏块可能是在某些特定环境下才会出现,所以有可能在自行的检测中被遗漏掉。 当坏块表创建后,主控会把坏块表保存在某个好的块里,每次重启后,主控会从那个块里把表调用进缓存(RAM)里。坏块表中定义的地址是不能被访问的,所以当系统想去访问这个块的地址时,FTL会重新把它映射到好的块地址上去。 块的替换: 在闪存的生命周期中,坏块会逐渐增多。闪存设备上有个状态寄存器,它的作用就是检测操作是否正确完成。当进行写入或擦除操作,状态寄存器检测到错误时,即可判定当前的块为坏块。 鉴于闪存的写入是以页为单位操作的,操作时可能影响到整个块里其它页的数据,所以当状态寄存器发现写入出现错误时,坏块管理程序就能够用好的块替换这个坏块,重新在新的好块里写入这个数据,并把检测到的坏块里其余的有效页数据全部复制到新的块里去,标记老的块为坏块,更新坏块表里的地址,把原本坏块的地址重新映射到新的好块里。(坏块管理流程见下图) 备注:Die在集成电路上的表现是一小堆可以实现特定功能的半导体材料。通常集成电路是从电子硅晶圆(EGS)或其它半导体材料(例如砷化镓)通过光刻工艺批量生产。晶圆被切割成许多小片,每一片包括一个完整的电路。这些小片就叫做Die。 ECC(Error Checking and Correction)校验和纠错 ECC的全称是 Error Checking and Correction or Error correction Coding,是一种用于差错检测和修正的算法。上一节的BBM中我们提到过,NAND闪存在生产和使用中都会产生坏块,BBM就是坏块的管理机制,而要有效管理坏块的首要前提就是有可靠的坏块检测手段。如果操作时序和电路稳定性不存在问题,NAND闪存出错的时候一般不会造成整个Block或Page不能读取甚至全部出错,而是整个Page中只有一个或几个bit出错,这时候 ECC就能发挥作用了。不同颗粒有不同的基本ECC要求,不同主控制器支持的ECC能力也不同,理论上来说ECC能力也是够用就行。 当前SSD内最普遍使用的ECC码是BCH码。当数据写入的时候,控制器内部的ECC模块计算数据并生成ECC签名,一般来说这个步骤非常快,因此并不会影响整个SSD太多的性能表现。ECC的签名一般来说都保存在NAND页后部的SA区域,当数据从NAND读取的时候ECC模块回去读取 ECC签名,并对照相同与否来发现出现的错误。 相比发现错误,修复接收到的数据错误更复杂。第一步是检测收到的数据是否出错,这个和上面生成ECC签名的操作一样非常快。如果检测到接收到的数据包含错误比特,就需要去生成独特的ECC算法(比如BCH),这部分会造成性能损失,但是只有在检测到错误时候才做。用生成的ECC算法来修复之前检测到的错误。 必须强调的是,ECC解码过程是可能出现失败的,所以ECC系统架构必须合理的设计才能保证ECC不出错,而ECC能够修复的错误比特数取决于ECC算法设计。 如果ECC纠不过来, 一般会报ECC Fail, 用户表现为Read Fail,有时候ECC甚至诊测不到出错, 就会导致数据错误。 NAND的稳定性需要有多方面保障,ECC只能用来保证部分比特出错时的修复,如果整个页甚至块出现大面积错误,那么只有RAID这类的冗余保护才能修复了。 在企业级产品中对ECC甚至还有更苛刻的要求,那就是数据完整性检查,SSD内部所有的总线, 先进先出数据缓存器部分都要查,可以检测数据在进入NAND之前的错误。 上图是个4KB页的NAND闪存。(SA区128字节) 1.每当一个page写入NAND闪存,数据会通过ECC引擎,创造独特的ECC签名。 2.数据和对应的ECC签名存都存放在NAND闪存里,数据放在数据区,ECC签名放在SA区。 3.当需要读取数据时,数据和ECC签名一起被送往主控制器,此时新的ECC签名被生成。 4.此时主控把2个签名对照,如果签名相同,说明数据没有错误,数据就会被送往主机。如果签名不同,数据就会先放在主控里,而不是直接送往主机。 某些主控会把改正后的数据再次写回闪存,另一些则不会,因为谁也不知道下次读取会不会再出错。 ECC的能力也影响到NAND 闪存的寿命和数据保存期。当NAND闪存的标称P/E数到了之后,错误数会越来越多,ECC弱的直接就报坏块并标记退休,如果ECC能力足够强,能挖掘出Flash更多潜力,只是效果比较有限。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有