简单了解SSD
- SSD VS HDD
- 机械硬盘HDD
- 固态硬盘SSD
- SSD的“解剖图”——系统框架图
- SSD的“基石”——存储介质
- 闪存器件
- 闪存芯片架构
- 三维闪存
- 闪存存在的问题
- SSD的“大脑”——FTL
- 映射管理
- 垃圾回收
- 修剪Trim
- 坏块管理
- 掉电恢复
- 磨损平衡
- SSD的“荣誉”——参数指标
SSD VS HDD
机械硬盘HDD
我们学习计算机组成或者操作系统的时候一定见过这样的计算公式:
也一定见过这样的图:
这就是我们所说的传统的机械硬盘,传统的HDD是“马达+磁头+磁盘”的机械结构,具体的物理结构如下:
固态硬盘SSD
SSD为“闪存介质+主控”的半导体存储芯片结构。如下图:
SSD的优点:
- 性能好。SSD可以在速度上秒杀HDD;
- 功耗低。作功耗HDD为6~8W, SATA SSD为5W,待机功耗SSD可降低到毫瓦(mW)级别;
- 抗震防摔。SSD内部不存在任何机械部件,相比HDD更加抗震;
- 无噪声。由于结构上没有马达的高速运转,SSD是静音的;
- 尺寸多变。HDD一般只有3.5寸和2.5寸两种形式,SSD除了这两种,还有更小的可以贴放在主板上的M.2形式,甚至可以小到芯片级,例如BGA SSD的大小只有16mm×30mm,甚至可做得更小。
目前HDD和SSD相比只有价格优势。
SSD的“解剖图”——系统框架图
SSD作为数据存储设备,其实是一种典型的(System on Chip)单机系统,有主控CPU、RAM、操作加速器、总线、数据编码译码等模块。如下图:
解释各个模块:
主机接口:与主机进行通信(数据交互)的标准协议接口,当前主要代表为SATA、SAS和PCIe等。
ARM:使用ARM CPU进行主控。
缓存控制器:管理buffer数据的传输。
buffer:数据缓冲区。
DRAM:存储映射表等。
ECC:数据编解码单元,由于闪存存储天生存在误码率,为了数据的正确性,在数据写入操作时应给原数据加入ECC校验保护。
闪存控制器:责管理数据从缓存到闪存的读取和写入。
闪存s:存储信息。
SSD可以分为前端和后端。前端负责主机与SSD进行通信,后端负责管理闪存,完成数据的传输。
具体的工作流程(以SATA写命令为例)如下:
- 主机发出Write FPDMA命令FIS(Frame Information Structure);
- SSD收到写命令后,判断自己内部写缓存(Write Buffer)是否有空间去接收新的数据。如果有,则发出DMA Setup FIS到主机端;否则什么也不发,主机端处于等待状态;
- 主机端收到DMA Setup FIS后,发送不大于8KB数据的Data FIS给设备;
- 重复步骤2和步骤3直到数据全部发送完毕;
- SSD送一个状态Status FIS给主机,表示从协议层面这条写命令完成全部操作。
SSD的“基石”——存储介质
闪存器件
目前绝大多数固态硬盘都是以闪存芯片为存储介质的,并且是NAND闪存。
固态硬盘的工作原理很多也都是基于闪存特性的。比如,闪存在写之前必须先擦除,不能覆盖写,于是固态硬盘才需要垃圾回收;闪存每个块(Block)擦写次数达到一定值后,这个块要么变成坏块,要么存储在上面的数据不可靠,所以固态硬盘固件必须做磨损平衡,让数据平均写在所有块上,而不是盯着几个块拼命写(不然很快固态硬盘就报废了)。
还有很多类似的例子,固态硬盘内部很多算法都是在为闪存服务的。所以,欲攻固态硬盘,闪存首当其冲。
闪存是一种非易失性存储器,也就是说,掉电了数据也不会丢失。闪存基本存储单元(Cell)是一种类NMOS的双层浮栅(Floating Gate)MOS管,如下图:
在源极(Source)和漏极(Drain)之间电流单向传导的半导体上形成存储电子的浮栅,浮栅上下被绝缘层包围,存储在里面的电子不会因为掉电而消失,所以闪存是非易失性存储器。写操作是在控制极加正电压,使电子通过绝缘层进入浮栅极。擦除操作正好相反,是在衬底加正电压,把电子从浮栅极中吸出来,如图:
擦除之后,闪存读出来的值为1,充过电之后,就是0。所以,如果需要写1,就什么都不用干;写0,就需要充电到0。
闪存芯片架构
一个闪存芯片有若干个DIE(或者叫LUN),每个DIE有若干个Plane,每个Plane有若干个Block,每个Block有若干个Page,每个Page对应着一个Wordline, Wordline由成千上万个存储单元构成。一个闪存内部的存储组织结构如图:
1. 问题一:为什么需要Cache Register和Page Register两个缓存?
主要目的是优化闪存的访问速度。Cache读支持在传输前一个Page数据给主控的时候(CacheRegister→主控),可以从闪存介质读取下一个主控需要读的Page的数据到Page Register(闪存介质→Page Register),这样数据在闪存总线传输的时间就可以隐藏在读闪存介质的时间里。
2. *问题二:为什么闪存的擦除是以Block为单位的?
在组织结构上,一个Block当中的所有存储单元是共用一个衬底的(Substrate)。当你对某衬底施加强电压,那么上面所有浮栅极的电子都会被吸出来。
三维闪存
为了克服二维平面单元结构的技术瓶颈,自2006年以来,各种三维闪存结构陆续被提出来。三维闪存结构并不是利用传统的缩小单元的方法,而是以提高堆叠栅极结构(WL)的数目来提高芯片的集成密度。如图:
闪存存在的问题
- 闪存坏块
闪存块具有一定的寿命,不是长生不老的。前面提到,当一个闪存块接近或者超出其最大擦写次数时,可能导致存储单元永久性损伤,不能再使用。随着闪存工艺不断向前发展,晶体管的尺寸越来越小,擦写次数也变得越来越少。
存中的存储单元先天就有一些是坏的,或者说是不稳定的,即出厂坏块。并且随着闪存的不断使用,坏的存储单元越来越多。所以,用户写入闪存的数据,必须要有ECC纠错码保护,这样即使其中的一些比特发生反转,读取的时候也能通过ECC纠正过来。 - 读干扰
从闪存读取原理来看,当你读取一个闪存页(Page)的时候,闪存块当中未被选取的闪存页的控制极都会加一个正电压,以保证未被选中的MOS管是导通的。这样问题就来了,频繁地在一个MOS管控制极加正电压,就可能导致电子被吸进浮栅极,形成轻微写,从而最终导致比特翻转。 - 写干扰
除了读干扰会导致比特翻转,写干扰(Program Disturb)也会导致比特翻转 - 存储单元间的耦合
栅极闪存存储电荷的是导体,因此存储单元之间存在耦合电容,这会使存储单元内的电荷发生意外变化,最终导致数据读取错误。 - 电荷泄漏
存储在闪存存储单元的电荷,如果长期不使用,会发生电荷泄漏。这同样会导致非永久性损伤,擦除后闪存块还能使用。
SSD的“大脑”——FTL
FTL是Flash Translation Layer(闪存转换层)的缩写,完成主机逻辑地址空间到闪存物理地址空间的翻译,或者说映射。SSD每次把用户逻辑数据写入闪存地址空间,便记录下该逻辑地址到物理地址的映射关系。当主机想读取该数据时,SSD便会根据这个映射,从闪存读取这笔数据然后返回给用户。
完成逻辑地址空间到物理地址空间的映射,这是FTL最原始且基本的功能。事实上,SSD中的FTL还有很多事情可做。
映射管理
据映射粒度的不同,FTL映射有基于块的映射,有基于页的映射,还有混合映射。
- 块映射中,以闪存的块为映射粒度,一个用户逻辑块可以映射到任意一个闪存物理块。
- 页映射中,以闪存的页为映射粒度,一个逻辑页可以映射到任意一个物理页中,因此每一个页都有一个对应的映射关系。
- 合映射是块映射和页映射的结合。一个逻辑块映射到任意一个物理块,但在块中,每个页的偏移并不是固定不动的,块内采用页映射的方式,一个逻辑块中的逻辑页可以映射到对应物理块中的任意页。
(PS:有没有学习Cache映射中全相联、直接映射、组相联的感觉)
映射基本原理
用户通过LBA(逻辑块地址)访问SSD,每个LBA代表着一个逻辑块,我们把用户访问SSD的基本单元称为逻辑页。而在SSD内部,SSD主控是以闪存页为基本单元读写闪存的,我们称闪存页为物理页。用户每写入一个数据页,SSD主控就会找一个物理页把用户数据写入,SSD内部同时记录了这样一条映射。有了这样一个映射关系后,下次用户需要读某个逻辑页时,SSD就知道从闪存的哪个位置把数据读取上来,如图:
SSD内部维护了一张逻辑页到物理页地址转换的映射表(Map Table)。用户每写入一个逻辑页,就会产生一个新的映射关系,这个映射关系会加入(第一次写)或者更改(覆盖写)映射表。当读取某个逻辑页时,SSD首先查找映射表中该逻辑页对应的物理页,然后再访问闪存读取相应的用户数据。
映射表在SSD掉电前,是需要把它写入到闪存中去的。下次上电初始化时,需要把它从闪存中部分或全部加载到SSD的缓存(DRAM或者SRAM)中。随着SSD的写入,缓存中的映射表不断增加新的映射关系,为防止异常掉电导致这些新的映射关系丢失,SSD的固件不仅仅只在正常掉电前把这些映射关系刷新到闪存中去,而是在SSD运行过程中,按照一定策略把映射表写进闪存。这样,即使发生异常掉电,丢失的也只是一小部分映射关系,上电时可以较快地重建这些映射关系。
一般有以下几种情况写入映射表:
- 新产生的映射关系累积到一定的阈值
- 用户写入的数据量达到一定的阈值
- 闪存写完闪存块的数量达到一定的阈值
垃圾回收
垃圾回收,就是把某个闪存块上的有效数据(下图中字母方块)读出来,重写,然后把该闪存块擦除,就得到新的可用闪存块了。
由于GC的存在,就有一个问题,用户要写入一定的数据,SSD为了腾出空间写这些数据,需要额外的做一些数据的搬移,也就是额外的写,最后往往导致SSD往闪存中写入的数据量比实际用户写入SSD的数据量多。因此,SSD中有个重要参数,就是写放大:
垃圾回收可以简单地分为三步:
- 挑选源闪存块。
- 从源闪存块中找有效数据。
- 把有效数据写入到目标闪存块
垃圾回收时机
- 前台垃圾回收(Foreground GC):当用户写入数据时,如果可用的闪存块小于一定阈值,这时就需要做垃圾回收,以腾出空间给用户写。这是被动方式,它是由于SSD没有多少可用的闪存块时,才去做的GC。
- 后台垃圾回收(Background GC),它是在SSD空闲(Idle)的时候,SSD主动去做的GC,这样在用户写入的时候就有充裕的可用闪存块,从而改善用户写入性能。
修剪Trim
户删除掉文件时,其实它只是切断用户与操作系统的联系,即用户访问不到这些地址空间;而在SSD内部,逻辑页与物理页的映射关系还在,文件数据在闪存当中也是有效的。
在没有Trim之前,SSD无法知道那些被删除的数据页是否无效,必须等到系统要求在相同的地方(用户空间、逻辑空间)写入数据时才知道那些数据是无效的,进而放心删除。由于SSD不知道这些删除的数据已经无效,在做垃圾回收的时候,仍把它当作有效数据进行数据的搬移,这不仅影响到GC的性能,还影响到SSD的寿命(写放大增大)。
Trim是一个新增的ATA命令(Data Set Management),专为SSD而生。当用户删除一个文件时,操作系统会发Trim命令给SSD,告诉SSD该文件对应的数据无效了。一旦SSD知道哪些数据无效之后,在做垃圾回收的时候就可以把这些删除掉的数据抛弃掉,不做无谓的数据搬移。这样不仅增强了SSD的性能,还延长了SSD寿命。
坏块管理
坏块来源
- 出厂坏块(Factory Bad Block):闪存从工厂出来,就或多或少的有一些坏块。
- 增长坏块(Grown Bad Block):随着闪存的使用,一些初期好块也会变成坏块。变坏的原因,主要是擦写磨损。
坏块管理策略
- 略过策略。用户根据建立的坏块表,在写闪存的时候,一旦遇到坏块就跨过它,写下一个Block。
- 替换策略。当某个Die上发现坏块时,它会被该Die上的某个好块替换。用户在写数据的时候,不是跨过这个Die,而是写到替换块上面去。采用此策略,除正常用户使用的闪存块,还需额外保留一部分好的闪存块,用于替换用户空间的坏块。
掉电恢复
掉电分两种,一种是正常掉电,另一种是异常掉电。不管是哪种原因导致的掉电,重新上电后,SSD都需要能从掉电中恢复过来,继续正常工作。
- 正常掉电。在掉电前,主机会通过命令通知SSD。SSD收到该命令后,主要会做:1. 把buffer中缓存的用户数据刷入闪存。2. 把映射表刷入闪存。3. 把闪存的块信息写入闪存(比如当前写的是哪个闪存块,以及写到该闪存块的哪个位置,哪些闪存块已经写过,哪些闪存块又是无效的等)4. 把SSD其他信息写入闪存。主机等SSD处理完以上事情后,才会真正停止对SSD的供电。
- 异常掉电,就是SSD在没有收到主机的掉电通知时就被断电;或者收到主机的掉电通知,但还没有来得及处理上面提到的那些事情,就被断电了。为防止异常掉电导致的数据丢失,一个简单的设计就是在SSD上加电容,SSD一旦检测到掉电,就让电容开始放电,然后把RAM中的数据刷到闪存上面去,从而避免数据丢失。
SSD映射表的恢复重建
SSD在把用户数据写到闪存的时候,会额外打包一些数据,我们叫它元数据(Meta Data),它记录着该笔用户数据的相关信息,比如该笔数据对应的逻辑地址、数据写入时间(时间戳)等。
这样映射表的恢复原理很简单,只要全盘扫描整个闪存空间,就能获得所有的映射关系,最终完成整个映射表的重构。
磨损平衡
磨损平衡,就是让SSD中的每个闪存块的磨损(擦除)都保持均衡(主要原因是闪存有寿命)。
下来的问题就是,SSD是怎么做磨损平衡的呢?在这之前,我们先抛出几个概念:冷数据(Cold Data)和热数据(Hot Data),年老的(Old)块和年轻的(Young)块。
- 冷数据,就是用户不经常更新的数据,比如用户写入SSD的操作系统数据、只读文件数据、小电影等;
- 热数据,就是用户更新频繁的数据。数据的频繁更新,会在SSD内部产生很多垃圾数据(新的数据写入导致老数据失效);
- 年老的块,就是擦写次数比较多的闪存块;
- 年轻的块,擦写次数比较少的闪存块,年纪相对小。
SSD很容易区分年老的块和年轻的块,看它们的EC(Erase Count,擦除次数)就可以了,大的就是老的,小的就是年轻的。
SSD一般有动态磨损平衡和静态磨损平衡两种算法。
- 动态磨损平衡算法的基本思想是把热数据写到年轻的块上,即在拿一个新的闪存块用来写的时候,挑选擦写次数小的
- 静态磨损平衡算法基本思想是把冷数据写到年老的块上,即把冷数据搬到擦写次数比较多的闪存块上。
SSD的“荣誉”——参数指标
- SSD容量
SSD容量是指提供给终端用户使用的最终容量大小,以字节(Byte)为单位。这里要注意,标称的数据都以十进制为单位的。我们很容易把它当成二进制。同样一组数据,二进制比十进制会多出7%的容量,例如:
以二进制为单位的容量称为裸容量,以十进制为单位的容量称为用户容量。 - 介质信息
当前SSD盘核心存储介质是闪存,之前也详细谈过了。闪存这种半导体介质有其自身物理参数,例如寿命(PE cycles,编程擦除次数)、Program(写编程)、Erase(擦除)和Read(读)时间、温度对读写擦的影响、闪存页的大小、闪存块的大小……这些都是介质的信息,介质的好坏直接影响数据存储的性能和完整性。闪存分SLC、MLC、TLC,它指的是一个存储单元存储的比特数,如下表:
闪存类型 | SLC | MLC | TLC |
每单元比特数 | 1 | 2 | 3 |
擦除次数/k | 100 | 3 | 1 |
读取时间/us | 30 | 50 | 75 |
编程时间/us | 300 | 600 | 1000 |
擦除次数/us | 1500 | 3000 | 1500 |
- 外观尺寸
SSD是标准件,外观尺寸需要满足一定的规定要求(长宽高和接口连接器),这又通常称为FormFactor。那SSD会有哪些Form Factor呢?细分为3.5寸、2.5寸、1.8寸、M.2、PCIe card、mSATA、U.2等Form Factor标准 - 性能指标
硬盘性能指标一般包括IOPS(Input Output Operations Per Second,反映的是随机读写性能)、吞吐量(Throughput,单位MB/s,反映的是顺序读写性能)、Response Time/Latency(响应时间/时延,单位ms或μs)。 - 时延指标
时延有平均时延和最大时延,数值越低越好。
平均时延计算公式是整个应用或者测试过程中所有命令响应时间总和除以命令的个数,反映的是SSD总体平均时延性能;
最大时延取的是在测试周期内所有命令中响应时间最长的那笔,反映的是用户体验,例如最大时延影响应用通过操作系统操作SSD时有无卡顿的用户体验。时延上了秒级,用户就会有明显的卡顿感知。 - 寿命指标
寿命(Endurance)指标,也就是在SSD产品保质期内,总的寿命是多少,能写入多少字节的数据量。衡量SSD寿命主要有两个指标,一是DWPD(Drive Writes Per Day),即在SSD保质期内,用户每天可以把盘写满多少次;另一指标是TBW(Terabytes Written),在SSD的生命周期内可以写入的总的字节数。 - 数据可靠性指标
SSD有几个关键指标来衡量其可靠性:UBER、RBER和MTBF。
UBER:Uncorrectable Bit Error Rate,不可修复的错误比特率。
RBER:Raw Bit Error Rate,原始错误比特率。
MTBF:Mean Time Between Failure,平均故障间隔时间。 - 功耗指标
空闲(Idle)功耗:当主机无任何命令发给SSD, SSD处于空闲状态但也没有进入省电模式时,设备所消耗的功耗。
Max active功耗:最大功耗是SSD处于最大工作负载下所消耗的功耗,SSD的最大工作负载条件一般是连续写,让闪存并发忙写和主控ASIC满负荷工作,这时的功耗值对应最大功耗。
Standby/Sleep功耗:规范规定了SSD状态,包括:Active、Idle、Standby和Sleep,功耗值从Active到Sleep逐级递减,具体的实现由各商家自行定义。一般来讲,在Standby和Sleep状态下,设备应尽可能把不工作的硬件模块关闭,降低功耗。一般消费级SSD Standby和Sleep功耗为100~500mW。
DevSleep功耗:这是SATA和PCIe新定义的一种功耗标准,目的是在Standby和Sleep基础上再降一级功耗,配合主机和操作系统完成系统在休眠状态下(如Hibernate), SSD关掉一切自身模块,处于极致低功耗模式,甚至是零功耗。一般是10mW以下。 - SSD系统兼容性
BIOS和操作系统的兼容性:一块兼容性良好的SSD需要在各种操作系统、BIOS、南北桥型号中正常运行。
电信号兼容性和硬件兼容性:SSD工作时,主机提供的电信号处于非稳定状态,比如存在抖动、信号完整性差等情况,但依然在规范误差范围内,此时SSD通过自身的硬件设计(比如powerregulator)和接口信号完整性设计依然能正常工作,数据也依然能正确收发。同理,在高低温、电磁干扰的环境下,SSD通过硬件设计要有足够的鲁棒性(Robust)。
容错处理:在主机端发生错误的条件下,SSD盘即使不能正常和主机交互数据,至少不能变砖。