固态存储相关知识

固态硬盘(Solid State Drive,简称为 SSD)

SSD的一些特性

○ 随着使用时间的增加和可用容量的降低,固态硬盘读写延迟会增大。
○ 相当长时间不用,固态硬盘里面的数据可能会丢失。
○ 将固态硬盘放置于高温下会影响里面的数据保存期限。
○ 垃圾回收不止存在于Java、Golang这些语言里面,固态硬盘很重要的一个特性就是垃圾回收。
○ 固态硬盘的擦除和写入次数是有限的,超过则不能保证有效的读写。
○ 固态硬盘包含外部接口、CPU、内存、闪存颗粒等,用来接受外部IO请求并根据一定的算法将IO请求落到闪存颗粒。
○ 为了延长固态硬盘的使用寿命,固态硬盘控制器需要考虑存储数据的冷热特性,同时也需要引入地址空间虚拟化技术。

常见概念

固态存储(Solid State Storage) : 采用半导体硅晶颗粒进行存储。 内存(RAM)、闪存(Flash)、相变存储(Phase Change Memory, 简称为 PCM)等都被称为固态存储。

闪存(Flash): 一种非易失性的半导体存储器件。所谓“非易失性”,是指在断电情况下仍能保持所存储的数据信息,分NOR闪存和NAND闪存。NOR闪存常用于存放系统启动程序,在嵌入式设备中较为常见;NAND闪存主要用于数据存储,固态硬盘中使用的就是NAND闪存.

固态硬盘(SSD):由控制器、内存、闪存颗粒(前面提到,因其多方面达到了领先的平衡,被广泛用于固态存储)等单元组成。控制器提供了外部主机接口、内部闪存管理接口,并通过内嵌的 CPU 来运行SSD固件,它管理着主机可见的存储地址空间、闪存物理空间、垃圾回收、磨损均衡等。内存用于运行SSD固件,并保存在地址空间虚拟化所需要的各种表项。闪存只是最终的存储信息的实体,多颗闪存颗粒分布在SSD的电路板上,共同为SSD提供存储空间 。

ATA:Advanced Technology Attachment,一种逻辑设备接口规范,SATA出来后改成PATA,最大传输速率为1Gbps。

SATA:串行ATA(Serial ATA,Serial Advanced Technology Attachment),是一种逻辑设备接口规范,当前有SATA 1.5Gbps、SATA 3Gbps、SATA 6Gbps和SATA 16Gbps多种传输规格。SATA只有1个命令队列,队列深度32。

SCSI:Small Computer System Interface,一种逻辑设备接口规范,最大传输速率是5Gbps。

SAS:串行SCSI(Serial Attached SCSI),一种逻辑设备接口规范,当前有SAS 3.0 Gbps、SAS 6.0 Gbps、SAS 12.0 Gbps、SAS 24.0 Gbps多个传输规格,与SATA兼容。需要通过适配器来和CPU进行通信。

NVMe :NVM Express,或称非易失性内存主机控制器接口规范(Non-Volatile Memory Host Controller Interface Specification,缩写:NVMHCIS),是一个逻辑设备接口规范,此规范主要是为基于闪存的存储设备提供一个低延时、内部并发化的原生界面规范。依托于PCIe总线,NVMe设备可适用于各种支持PCIe总线的物理插槽上。NVMe可以有65535个命令队列,每个队列都可以深达65536个命令。无需适配器,可以和CPU直接通信,降低交互延迟。

PCI:外部链接(Peripheral Component Interconnect)标准,或称个人电脑接口(Personal Computer Interface),是一种连接电脑主板和外部设备的总线标准,规定了该总线的物理尺寸(包括线宽)、电气特性、总线时序和协议。现已被PCI Express和其他更先进的技术取代。

PCIe:PCI Express,简称PCI-E,官方简称PCIe,是计算机总线的一个重要分支,仅应用于内部互连。拥有更快的速率,所以几乎取代了以往所有的内部总线(包括AGP和PCI),为PCI所设计的操作系统可以不做任何代码修改来启动PCIe设备。

1. 存储原理: 

闪存使用三端器件作为存储单元,分别为 源极、漏极和栅极,主要利用电场的效应来控制源极与漏极之间的通断;在栅极 与硅衬底之间增加了一个浮置栅极,浮置栅极可以存储电荷,利用电荷存储来存 储记忆。

擦除:释放浮置栅极的电荷,从而使之变成‘1’,这个动作被称为“擦除”。

编程:向浮置栅极注入电荷,从而使之变成‘0’,这个动作被称为“编程”。1写成0

 

2. 内部组织结构

闪存颗粒内部一般由成千上万个大小相同的块(Block) 所组成,块大小一般为数百 KB 到数 MB。每一个块的内部又分为若干个大小相同的页(Page),页的大小一般为 4KB 或者 8KB

  

3. 数据写入

 ○ Flash写入(1->0)的粒度是页,如果闪存中某个页已经被写入了数据,那么不能向这个页中再次直接写 入数据,只能在这个页的数据被清空以后才能再次写入。数据写入页时,将特定的 bit 位从 1 变成 0,这个页就保存了相应的数据。
Flash擦除((0->1))的粒度是块,即一次清空动作会将一个块的数据全部抹除。清空动作对应着闪存的擦除动作,即擦除了一个块的数据后,这 个块中所有的 bit 位都变成了 1。
○ 写入动作对应着闪存的编程动作,将一次擦写(Program/Erase,简称为 P/E)就是一轮“擦除”和“编程”操作,每个块的 P/E 次数有限;当某个块的 P/E 次数达到上限后,就无法保证不能保证有效的读写数据。

4. 数据读出

○ 闪存中保存的数据,经过一段时间后,可能存在若干 bit 位的错误。如果直接将页中读出的数据返回给上层业务,就可能造成业务失败。
○ 为了保证返回给上层业务的数据是正确有效的,闪存内部预留了部分空间用于保存业务数据的 ECC(Error Correcting Code,纠错码)。每当读取数据时,控制器会使用相应的 ECC 对这些数据进行错误检查和纠正。
○ 受限于控制器的计算能力,ECC 的纠错范围有限,只能在页面数据中出现bit 位错误的数量不超过一定的上限时才有效。当前主流的 ECC 纠错能力一般是 24bit/1KB,即每 1KB 数据(包含业务数据和 ECC 校验数据) 内出现了 bit 位错误不超过24个时,控制器可以通过计算的方式得出正确有效的业务数据。
○ 当某个页中的 bit 位错误数超过控制器的计算能力后,该页的业务数据无法被正确读出,此时便产生一个 UNC(Uncorrectable)错误,UNC 错误只能被更高层级的 RAID 机制所修复。

5. 闪存分类

○ 目前常见的闪存,可分为 SLC、MLC、TLC 几类。
○ SLC 是 Single Level Cell 的缩写,表示 NAND 闪存内部的每个 cell 只能 存储一个 bit 位的信息,即使用两个电平值来分别表示 0、1。
○ MLC 是 Multi Level Cell 的缩写,原本表示 NAND 闪存内部的每个 cell 可以保存多个 bit 位的信息,但是实际使用中,MLC 特指每个 cell 保存 两个 bit 位的信息,即使用四个电平值来分表表示 00、01、10、11。MLC 又可以细分为 eMLC(Enterprise MLC,企业级 MLC)和 cMLC (Consumer MLC,消费级 MLC)。eMLC 和 cMLC 在本质上相同,只是在工厂制造处理过程中,厂商把通 过了某些数据完整性和耐用度测试之后、确认可以达到较高 P/E 次数的 MLC 定义为 eMLC,余下的就成为 cMLC。
○ TLC 是 Triple Level Cell 的缩写,表示 NAND 闪存内部的每个 cell 可以 保存三个 bit 位的信息,即使用八个电平值来分别表示 000、001、010、 011、100、101、110、111。

 

 

SSD介绍

上面提到闪存是具体的存储介质,但是光有闪存颗粒是不行的,在其外围还需要有一个控制器,即SSD控制器,同时为了运行各种算法,还需要有一定的内存空间。 一块SSD,由控制器、内存、闪存颗粒等单元所组成 。

 ○ 控制器提供了外部主机接口、内部闪存管理接口,并通过内嵌的 CPU 来运行 SSD 固件;SSD 固件管理着主机可见的存储地址空间、闪存物理空间、垃圾回收、磨损均衡等。
○ 内存用于运行 SSD 固件,并保存在地址空间虚拟化所需要的各种表项。
○ 多颗闪存颗粒分布在 SSD 的电路板上,共同为SSD 提供存储空间。

 提高SSD的可靠性的方法

前面提到闪存颗粒是有P/E次数的限制,超过则会影响SSD存储数据的可靠性,下面的方法或者措施都是从提高SSD的可靠性方面来考量的。

1. 地址空间虚拟化   

 ○ SSD 的 LBA(Logical Block Address,逻辑块地址)到 PBA(Physical Block Address,物理块地址)的映射,并非固定的映射,而是可以随时更改的。
    ○ SSD 内部的最小空间管理粒度是页,每个页都有唯一的一个编号,这就是 PBA 。
    ○ SSD 内部维护了一张映射表,记录了 LBA 到 PBA 的映射关系 。
    ○ 当业务上面某个字段经常修改,若无地址空间虚拟化技术,则会往同一个物理区域进行擦除和写入(闪存特性决定:以页为单位写入,且在写入前需要擦除),这样很容易造成热点数据对应的物理区域达到P/E上限。为了均衡闪存的P/E次数,SSD控制器选择一个或者多个干净的页来保存这些字段修改结果,同时让映射表记录下新的映射关系。所谓“干净”,是指这些页 经历过一次擦除,同时尚未经历编程。

2. 容量冗余

为了避免部分闪存损坏所导致的整块 SSD 失效,SSD 在设计时都会做到容量冗余。举例,一块标称为 100GB SSD,内部实际的闪存物理容量一般都做到了 110GB 以上。 超过标称容量的部分,与标称容量的比值,被称为冗余比。一般而言,冗余比越 大,则 SSD 的可靠性、寿命、性能就越好。 企业级存储产品的冗余比一般要达到28%以上。

 

3. 磨损均衡

磨损均衡(Wear Leveling,简称 WL)所做的事情,就是记录每一个块的 P/E 次 数,然后在需要擦除或者写入数据时,尽量选择那些 P/E 次数相对较少的块。经 过了磨损均衡的 SSD,使用寿命可以得到最大化。

○ 动态磨损均衡:指该类磨损均衡由主机 IO 所触发 ,当主机发起一个写请求时,SSD 需要找一个或者多个干净页供新数据的写入。此 时,动态磨损均衡算法会生效,尽量选择那些 P/E 次数相对较少的块来提供干净页。
○ 静态磨损均衡:指该类磨损均衡是 SSD 内部自主发起的。 考虑这样的极端场景,一块 100GB 容量的 SSD 装满了用户数据,其中 99GB 是冷数据,用户写入后再没有更新,剩下 1GB 是热数据,用户在频繁更新。对于这 99GB 的冷数据,如果不进行特殊的处理,那么就会一直占用至少 99GB 固定的物理闪存区域,于是剩下的空间就留给 1GB 热数据进行反复的擦写。显而易见,一段时间后,99GB 被固定占用的闪存区域的 P/E 次数就会变得明显低于剩下的闪存区域。这样的不均衡容易导致 SSD 提前失效。 静态磨损均衡可以解决上述问题:通过记录每个块的 P/E 次数,识别出那些磨损相对轻微、且长期没有产生垃圾页的块(即保存了冷数据的块),主动将其中的有效数据迁移到磨损相对严重的块中,从而达到保持整个SSD 磨损均衡的效果

4. 坏块管理

SSD 的使用过程中,尽管有各种机制和算法来尽量延长使用寿命,但是闪存的损坏依然是不可避免的。容量冗余为解决闪存损坏的问题提供了基础保证。闪存的损坏,是以页为粒度的,即一个块内部包含了若干的页,可能有的页处于正常状态,另外的一些页处于损坏状态。 实际上,当某个块内部出现了多个损坏的页时,这个块的其他页大都处于损坏的边缘。鉴于此,SSD 的固件一般以块为粒度来管理闪存的损坏情况:当发现某个块内部、因为损坏而无法读出数据的页的数量超过某个阈值时,则判定这个块已损坏,随后就将这个块中的有效数据迁移到其他可用的块中,并将这个损坏了的块标记为损坏,自此不再用于保存任何业务数据。

SSD 固件发现坏块的手段包括两种:主机 IO 触发、内部巡检。在SSD生命周期中,大概有1.5%的块会变成坏块。

5. 数据冗余保护

  SSD使用多种冗余检查方法来保护用户数据不受位翻转、操作或丢失的影响。

1. 在SSD控制器内存中使用纠错码(ECC)和循环冗余校验(CRC)来防止数据更改或操作。
2. 在闪存颗粒中使用低密度奇偶校验(LDPC)和CRC来防止闪存颗粒错误导致的数据丢失。
3. 在闪存颗粒之间使用异或冗余来防止闪存故障导致的数据丢失

 SSD的寿命

SSD 的使用寿命可以直接反映在写入数据量上

SSD的垃圾回收

地址空间虚拟化在避免了对相同物理区域反复擦写的同时,也引入了垃圾数据和垃圾页。解释如下:

1. 主机访问 LBA 500,写入数据 AA,不妨假设 SSD 内部使用编号为101的页来保存数据 AA。
2. 过了一段时间,主机再次访问 LBA 500,写入数据 BB,由于闪存的特性,编号101的页是不能直接写入的,除非已经经过了擦除,但是SSD的擦除又是以块为单位的,因此需要借助地址空间虚拟化机制让数据BB写入到另外一个页,不妨假设这个页的编号为201。
3. 经历了上述两个写操作,页 101 保存了数据 AA,页201保存了数据 BB,且 页 101 保存的数据是无用的,页 201 中保存的数据才是有用的。页101中保存的数据被称为垃圾数据,页101 就被称为垃圾页

垃圾回收(Garbage Collection,简称 GC)的目的就是擦除垃圾数据,让垃圾页变成可以写入数据的干净页。在 SSD 的内部实现中,垃圾回收一般是后台任务,不断监控着 SSD 内部的块和 页的使用情况,当垃圾页过多的时候,就会:

1. 选择那些包含了较多垃圾页的块,将其中的有效数据迁移到其他块的干净页。
2. 对那些不再包含有效数据的块执行擦除操作。
3. 将执行了擦除操作的块放入可用资源池中,以供新的数据写入

垃圾回收在不断净化 SSD 的同时,也在 SSD 内部制造了更多的写操作,从而使得闪存所真正承载的写入数据量超过了主机写入的数据量,这种现象被称为写放大。当业务模型固定时,闪存真正承载的写入数据量和主机写入的数据量这两者的比 值,不会随着时间的推移而变化,而是以个固定数值为中心点小范围波动,我们 称这个中心点为写放大系数,值越小越好 。

写放大系数的业界主流水准如下,由此可见,虽然SSD能够胜任随机IO访问,但是在业务允许的情况下,能顺序IO访问则更好,这样可以有效减低写放大系数,从而减少闪存的P/E次数,最终提高固态硬盘的使用寿命。

○ 在全随机小 IO 业务场景下,写放大系数约为 2.5。
○ 在顺序大 IO 业务场景 下,写放大系数约为 1.1 。

 

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值