固态硬盘(SSD)原理及相关介绍+SSD基本工作原理

全网最强硬盘知识飞凌一网打尽

一、硬盘的基本分类

1.机械硬盘,最常见的就是2.5寸,3.5寸盘。以前还有1.8寸的微硬盘,但是已经见不到了,现在最多的就是2.5寸和3.5寸。

小知识点:

机械硬盘顾名思义就是采用磁性碟片来存储数据,以机械结构驱动磁头来读取数据的硬盘。主要由磁盘盘片、磁头、主轴与传动轴等组成,数据就存放在磁盘盘片中。

机械硬盘结构

2.固态硬盘,也就是SSD,通过闪存颗粒来存储数据。固态硬盘因为没有了机械硬盘的物理结构,所以相比机械硬盘具有了低能耗、无噪声、抗震动、低散热、体积小和速度快的优势。从外形上来说有2.5寸形式,也有卡片形式。

小知识点:

固态电子器件是指利用固体内部电子运动变化原理制成的具有一定功能的电子器件,包括晶体管、微处理器芯片、动态随机存取存储器(DRAM)、闪存颗粒等半导体。

固态硬盘结构

二、3个维度描述硬盘:硬件接口、数据通道、工作模式

1.硬件接口,也就是硬盘和底板之间的连接器或物理连接方式

a.SATA标准接口,这是在飞凌的底板上最常见的硬盘接口,对于3.5寸的机械硬盘来说还需要12V的供电,所以飞凌在底板设计时如果涉及到标准SATA接口的话一般都会加一个硬盘的专用供电接口。右图是四针供电转SATA硬盘供电线。

飞凌OK5718-C SATA接口及硬盘供电接口 红线为5V,黑线为GND,黄线为12V

b.mSATA接口,另一种在飞凌嵌入式底板上常见的硬盘接口形式。可以将SATA技术整合在小尺寸的装置上,同时提供与SATA标准接口一样的速度和可靠度

某品牌mSATA固态硬盘 飞凌OK1046-C mSATA接口

小知识点:

mSATA和miniPCIe的区别:这两个接口的硬件形式是一样的,都是54针插座,外观形式是完全相同的。但却是两种完全不同的硬件接口,mSATA硬盘的数据信号需要连接到SATA控制器上,而非PCIe控制器上,二者之间因此不能兼容。如果要实现一个接口同时兼容mSATA与MiniPCIe,则需要使用PCIe/SATA路由芯片来解决。

如何区分mSATA硬盘和miniPCIe硬盘?从外观上是无法区分mSATA硬盘和miniPCIe硬盘的,如果硬要区分的话一般就是2点,一个是miniPCIe硬盘很少见,几乎没有;另一个就是看说明书。

如何区分mSATA接口和miniPCIe接口?从外观上也无法区分底板上的连接器到底是mSATA还是miniPCIe或者两者兼容。要区分也是要看说明书。。。

c.M.2接口M.2是一种标准连接器,根据选择的Key接口不同,可以兼容不同的数据通道。

某品牌M.2 M Key SSD NVMe工作模式 飞凌OK3399-C M.2 M Key接口PCIeX4

飞凌嵌入式新品OK3399-C底板上的M.2接口就是M Key形态,可以支持PCIeX4,NVMe工作模式的SSD。

小知识点:

M.2规范定义了A到M 12种Key接口:

市面常见的就是B key和M key,不同Key可以内置的数据信号见上图。其中B key中可以有PCIe X2,SATA3.0,USB2.0,USB3.0这些信号,M Key只有PCIe X4和SATA3.0信号。还有一种B+M Key,这种接口形式其实是为了兼容底板上不同的接口形态,这种接口的设备只能走B Key内的数据协议,也就是满足不了PCIe X4。只有M Key接口的硬盘才能使用PCIeX4的数据通道。

B Key和M Key外观区别 某品牌M.2接口5G模组B Key

d.SAS接口,一般都是服务器使用。稳定性和安全性很高,消费级或民用一般用不到,都是大规模数据中心使用。

小知识点:

SAS接口和SATA接口完全兼容,SATA硬盘可以直接使用在SAS的环境中。从接口标准上而言,SATA是SAS的一个子标准 但是SAS硬盘却不能使用在SATA的环境中,因为SATA控制器并不能对SAS硬盘进行控制。

某品牌SAS硬盘 服务器主板SAS接口

e.U.2接口 目前在一些新的主板或者服务器上开始出现的新接口,内部也是PCIeX4和SATA通道都有,也支持NVMe协议。要逐步取代SAS/SATA接口。

U.2接口形态

某品牌数据中心企业级SSD,PCIe X4,NVMe

f.miniPCIe接口,这种接口的硬盘很少见。下图是联想出的一个miniPCIe接口的硬盘,其实是在PCB上有一个SATA转PCIe的芯片。这个SSD硬盘已经停产了,早期时对只有miniPCIe接口的笔记本来说是个很好的扩展方式。

黄框:Marvell 88SE9170 PCIe Gen 2x1 / SATA 6Gb I/O双端口控制器

g.PCIe插槽,一般都是PCIeX4 NVMe模式。

某品牌PCIe SSD 某品牌主板2*PCIeX16,2*PCIeX4,3*PCIeX1

2.数据通道也就是硬盘和内存或CPU间通过哪种总线进行数据传输。

a.SATA协议:这个是SATA协会公布的技术规范标准,目前最新的是SATA 6Gbps,也就是sata3.0(目前最新版本应该是3.4,速率没有提升,依然是6Gbps,这些小版本变化都是稳定性或者安全性之类的提升)。飞凌嵌入式核心板所支持最高的版本也是sata3.0。M.2规范中的SATA版本是最低SATA3.1。

b.PCIe协议:这个是PCI-SIG组织公布的技术规范,目前最新发布版本是6.0。市面上可见的SSD支持的最高版本是PCIe4.0,事实上目前PCIe4.0也刚开始进入市场,5.0的设备还没有。飞凌嵌入式核心板所支持最高的版本是PCIe 3.0。下面是不同版本PCIe的速率对比。

小知识点:

关于PCIe Xn:PCIe可以多个通道并行吞吐数据,数据吞吐带宽也会成倍增长,一般单通道叫做X1(X在这本来就是乘的意思),以此类推有X4、X8最高可以16通道同时吞吐数据也就是X16。

PCIe插槽及金手指对比

PCIe插槽中前22针都是供电,隔断后面是数据线,x1设备可以插在x4 x8 x16插槽中,但是只能按x1速率工作,x4设备及x8设备以此类推。反之X16设备遮盖住后面的针脚后就可以工作在x1 x4 x8速率上,x8 x4设备也以此类推。

下图是PCIe4.0和PCIe3.0的SSD的读写速度对比,都是M.2 M key接口(PCIeX4)NVMe工作模式,可见都是PCIeX4和NVMe,但是因PCIe版本不同速度差异也很大。

3.硬盘工作模式

硬盘最早是机械结构构成,包括马达,磁头,盘面等机械部件。要提高读写速率,就要不断的优化内部磁头读写的方式,所以产生了工作模式之分。

a.IDE并口模式,对应老旧的IDE硬盘(ATA或者叫PATA),现在已经没有这种设备。

b.AHCI串口模式,这个是对应SATA硬盘出现后而出现的新的工作模式,相对IDE模式提高了数据读写速度,优化了读写方式,但依然是基于机械硬盘的方式进行优化。

c.NVMe非易失性存储接口规范,这个是专门针对SSD硬盘而出现的工作模式,NVMe模式都是基于PCIeX4通道的数据传输模式,数据读写速度高,是特意为闪存颗粒进行优化的读写模式。是高端SSD所特有的工作模式。

4.一图流小结

硬盘分类

硬件接口

数据通道

工作模式

传输速率

机械硬盘

SATA

SATA2.0/SATA 3.0

AHCI

3Gbps/6Gbps

SSD

SATA

SATA2.0/SATA 3.0

AHCI

3Gbps/6Gbps

mSATA

SATA2.0/SATA 3.0

AHCI

3Gbps/6Gbps

M.2 B Key M.2 B+M Key

SATA 3.0

AHCI

6Gbps

M.2 M Key

PCIeX4

NVMe

32GT/s(PCIe 3.0)

U.2

PCIeX4

NVMe

32GT/s(PCIe 3.0)

PCIe插槽

PCIex4

NVMe

32GT/s(PCIe 3.0)

注M.2 M Key接口和U.2接口也支持SATA通道,但是没有这样的设备,SATA相对PCIeX4来说速率太低了。在这些接口中还用SATA模式是种浪费。从京东上来看,直接把M.2硬盘分类成了M.2(NVMe)和M.2(SATA总线)前者都是M Key,后者基本都是B+M Key

三、飞凌嵌入式产品硬盘接口支持情况

核心板

核心板数据通道

底板接口形态

硬盘工作模式

核心板PCIe情况

FETMX6Q-C

1*SATA 2.0

SATA

AHCI

1个PCIe2.0通道

FETMX6Q-S3

1*SATA 2.0

SATA

AHCI

1个PCIe2.0通道

FET1012A-C

1*SATA 3.0

SATA

AHCI

最多1个PCIe2.0通道

FET1043A-C

1*SATA 3.0

mSATA 需修改RCW

AHCI

可配出PCIeX4 2.0

FET1046A-C

1*SATA 3.0

mSATA

AHCI

可配出PCIeX4 3.0

FET5718-C

1*SATA 2.0

SATA

AHCI

2个PCIe3.0通道

FETA40i-C

1*SATA 2.0

SATA

AHCI

无PCIe

FETT3-C

1*SATA 2.0

SATA

AHCI

无PCIe

FET3399-C

1*PCIeX4 2.0

M.2 M Key

NVMe

PCIeX4 2.0

注:具体请联系飞凌嵌入式客服或销售人员

四、本地硬盘测试

下面是笔者以自己的笔记本做的测试,正好这个笔记本有一个SSD和一个机械硬盘可以对比。

左面是SSD,右面是机械硬盘,实际上机械硬盘的测试笔者没做完就结束了,太慢了。从这里也可看出实际上机械硬盘的读取速率是远远低于SATA接口的数据传输速度上限(6Gbps大约700多MB/S)的,但是SSD的读写速度已经接近了SATA数据传输速度的上限,这也是SSD硬盘必须逐渐转到更高速的通信协议和专门基于SSD进行优化的工作模式下的原因。

SSD型号:HFS128G39TND海力士M.2 B+M Key 2280 SATA3.0 AHCI模式

机械盘型号:WD10SPZX西部数据5400转128MB缓存SATA3.0 AHCI模式

五、硬盘的未来

自上世纪50年代硬盘被发明以来至今,其自身已经历了无数的进化和演变。但是万变不离其宗,这一切的变化无不是在速度、容量、安全、稳定上做文章。无论是机械硬盘提高转速的做法还是以半导体芯片的高速读取能力的来提升工作效率,硬盘技术都是在持续不断的向更快更强更便捷的方向发展着。

而飞凌嵌入式也是步步紧跟硬盘进化的趋势,从略显老旧的SATA机械硬盘到如今最热火的NVMe SSD硬盘都已纳入了支持的范围。无论以后硬盘技术再如何发展,飞凌嵌入式都仍会保持着自己技术的先进性站在潮流的最前端。

固态硬盘(SSD)原理及相关介绍

1. 什么是SSD

固态硬盘(Solid State Drives),用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。固态硬盘在接口的规范和定义、功能及使用方法上与普通硬盘的完全相同,在产品外形和尺寸上也完全与普通硬盘一致。被广泛应用于军事、车载、工控、视频监控、网络监控、网络终端、电力、医疗、航空、导航设备等领域。

2. SSD的分类

固态硬盘(SSD)的存储介质分为两种,一种是采用闪存(FLASH芯片)作为存储介质,另外一种是采用DRAM作为存储介质。

基于闪存类:基于闪存的固态硬盘(IDEFLASH DISK、Serial ATA Flash Disk),采用FLASH芯片作为存储介质,这也是通常所说的SSD。它的外观可以被制作成多种模样,例如:笔记本硬盘、微硬盘、存储卡、U盘等样式。这种SSD固态硬盘最大的优点就是可以移动,而且数据保护不受电源控制,能适应于各种环境,适合于个人用户使用。

基于DRAM类:基于DRAM的固态硬盘,采用DRAM作为存储介质,应用范围较窄。它仿效传统硬盘的设计,可被绝大部分操作系统的文件系统工具进行卷设置和管理,并提供工业标准的PCI和FC接口用于连接主机或者服务器。应用方式可分为SSD硬盘和SSD硬盘阵列两种。它是一种高性能的存储器,而且使用寿命很长,美中不足的是需要独立电源来保护数据安全。DRAM固态硬盘属于比较非主流的设备。

3. SSD的构成

SSD主要由主控制器,存储单元,缓存(可选),以及跟HOST接口(诸如SATA,SAS, PCIe等)组成。

3.1 主控制器

每个 SSD 都有一个控制器(controller)将存储单元连接到电脑,主控器可以通过若干个通道(channel)并行操作多块FLASH颗粒,类似RAID0,大大提高底层的带宽。控制器是一个执行固件(firmware)代码的嵌入式处理器。主要功能如下:

(1)错误检查和纠正(ECC)

(2)磨损平衡(Wear leveling)

(3)坏块映射(Bad block mapping)

(4)Read disturb(读取某个块的数据的时候会影响到相邻块的数据)管理

(5)缓存控制

(6)垃圾回收

(7)加密

3.2 存储单元

尽管有某些厂商推出了基于更高速的 DRAM 内存的产品,但 NAND 闪存依然最常见,占据着绝对主导地位。低端产品一般采用 MLC(multi-level cell) 甚至 TLC(Triple Level Cell) 闪存,其特点是容量大、速度慢、可靠性低、存取次数低、价格也低。高端产品一般采用 SLC(single-level cell) 闪存,其特点是技术成熟、容量小、速度快、可靠性高、存取次数高、价格也高。但是事实上,取决于不同产品的内部架构设计,速度和可靠性的差别也可以通过各种技术加以弥补甚至反转。

存储单元内部结构

一个Flash Page由两个或者多个Die(又称chips组成),这些Dies可以共享I/0数据总线和一些控制信号线。一个Die又可以分为多个Plane,而每个Plane又包含多个多个Block,每个Block又分为多个Page。以Samsung 4GB Flash为例,一个4GB的Flash Page由两个2GB的Die组成,共享8位I/0数据总线和一些控制信号线。每个Die由4个Plane组成,每个Plane包含2048个Block,每个Block又包含64个4KB大小的Page。

存储单元的分类

SLC(Single Level Cell 单层单元),就是在每个存储单元里存储 1bit 的数据,存储的数据是0还是1是基于电压阀值的判定,对于 NAND Flash 的写入(编程),就是控制 Control Gate 去充电(对 Control Gate 加压),使得浮置栅极存储的电荷够多,超过4V,存储单元就表示 0(已编程),如果没有充电或者电压阀值低于4V,就表示 1(已擦除)。

MLC(Multi-Level Cell 多层单元),就是每个存储单元里存储 2bit 的数据,存储的数据是“00”,“01”,“10”,“11”也是基于电压阀值的判定,当充入的电荷不足3.5V时,就代表“11”,当充入的电荷在3.5V和4.0V之间,则代表“10”,当充入的电荷在4V和5.5V之间,则表示“01”,当充入的电荷在5.5V以上,则表示“00”。同时由前面的图可以看到,MLC 相比 SLC 虽然使用相同的电压值,但是电压之间的阀值被分成了4份,可以想象这样就直接影响了性能和稳定性。

TLC(Triple Level Cell 三层单元),就更加复杂,因为每个存储单元里存储 3bit 的数据,所以它的电压阈值的分界点就更细致,导致的结果也就每个存储单元的可靠性也更低。

4. Host访问SSD的原理

Host是通过LBA(Logical BlockAddress,逻辑地址块)访问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数据。

大多数SSD,我们可以看到上面都有板载DRAM,其主要作用就是用来存储这张映射表。也有例外,比如基于Sandforce主控的SSD,它并不支持板载DRAM,那么它的映射表存在哪里呢?SSD工作时,它的绝大部分映射是存储在FLASH里面,还有一部分存储在片上RAM上。当Host需要读取一笔数据时,对有板载DRAM的SSD来说,只要查找DRAM当中的映射表,获取到物理地址后访问Flash从而得到Host数据.这期间只需要访问一次FlashH;而对Sandforce的SSD来说,它首先看看该Host Page对应的映射关系是否在RAM内,如果在,那好办,直接根据映射关系读取FLASH;如果该映射关系不在RAM内,那么它首先需要把映射关系从FLASH里面读取出来,然后再根据这个映射关系读取Host数据,这就意味着相比有DRAM的SSD,它需要读取两次FLASH才能把HOST数据读取出来,底层有效带宽减半。对HOST随机读来说,由于片上RAM有限,映射关系Cache命中(映射关系在片上RAM)的概率很小,所以对它来说,基本每次读都需要访问两次FLASH,所以我们可以看到基于Sandforce主控的SSD随机读取性能是不太理想的。

5. SSD相关概念和技术

5.1 多 Plane NAND

多 Plane NAND 是一种能够有效提升性能的设计。例如,一个晶片内部分成了2个 Plane,而且2个 Plane 内的 Block 编号是单双交叉的,想象我们在操作时,也可以进行交叉操作(一单一双)来提升性能。

5.2 FTL

操作系统通常将硬盘理解为一连串 512B 大小的扇区[注意:操作系统对磁盘进行一次读或写的最小单位并不是扇区,而是文件系统的块,一般为 512B/1KB/4KB 之一(也可能更大),其具体大小在格式化时设定],但是闪存的读写单位是 4KB 或 8KB 大小的页,而且闪存的擦除(又叫编程)操作是按照 128 或 256 页大小的块来操作的。更要命的是写入数据前必须要先擦除整个块,而不能直接覆盖。这完全不符合现有的、针对传统硬盘设计的文件系统的操作方式,很明显,我们需要更高级、专门针对 SSD 设计的文件系统来适应这种操作方式。但遗憾的是,目前还没有这样的文件系统。为了兼容现有的文件系统,就出现了 FTL(闪存转换层),它位于文件系统和物理介质之间,把闪存的操作习惯虚拟成以传统硬盘的 512B 扇区进行操作。这样,操作系统就可以按照传统的扇区方式操作,而不用担心之前说的擦除/读/写问题。一切逻辑到物理的转换,全部由 FTL 层包了。

FTL 算法,本质上就是一种逻辑到物理的映射,因此,当文件系统发送指令说要写入或者更新一个特定的逻辑扇区时,FTL 实际上写入了另一个空闲物理页,并更新映射表,再把这个页上包含的旧数据标记为无效(更新后的数据已经写入新地址了,旧地址的数据自然就无效了)。

5.3 磨损平衡(Wear leveling)

简单说来,磨损平衡是确保闪存的每个块被写入的次数相等的一种机制。

通常情况下,在 NAND 块里的数据更新频度是不同的:有些会经常更新,有些则不常更新。很明显,那些经常更新的数据所占用的块会被快速的磨损掉,而不常更新的数据占用的块磨损就小得多。为了解决这个问题,需要让每个块的编程(擦写)次数尽可能保持一致:这就是需要对每个页的读取/编程操作进行监测,在最乐观的情况下,这个技术会让全盘的颗粒物理磨损程度相同并同时报废。

磨损平衡算法分静态和动态。动态磨损算法是基本的磨损算法:只有用户在使用中更新的文件占用的物理页地址被磨损平衡了。而静态磨损算法是更高级的磨损算法:在动态磨损算法的基础上,增加了对于那些不常更新的文件占用的物理地址进行磨损平衡,这才算是真正的全盘磨损平衡。简单点说来,动态算法就是每次都挑最年轻的 NAND 块来用,老的 NAND 块尽量不用。静态算法就是把长期没有修改的老数据从一个年轻 NAND 块里面搬出来,重新找个最老的 NAND 块放着,这样年轻的 NAND 块就能再度进入经常使用区。

尽管磨损均衡的目的是避免数据重复在某个空间写入,以保证各个存储区域内磨损程度基本一致,从而达到延长固态硬盘的目的。但是,它对固态硬盘的性能有不利影响。

5.4 垃圾回收(Garbagecollection)

当整个SSD写满后,从用户角度来看,如果想写入新的数据,则必须删除一些数据,然后腾出空间再写。用户在删除和写入数据的过程中,会导致一些Block里面的数据变无效或者变老。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了.

另一方面,由前面的磨损平衡机制知道,磨损平衡的执行需要有“空白块”来写入更新后的数据。当可以直接写入数据的“备用空白块”数量低于一个阀值后,SSD主控制器就会把那些包含无效数据的块里的所有有效数据合并起来写到新的“空白块”中,然后擦除这个块以增加“备用空白块”的数量。

有三种垃圾回收策略:

闲置垃圾回收:很明显在进行垃圾回收时候会消耗大量的主控处理能力和带宽造成处理用户请求的性能下降,SSD 主控制器可以设置在系统闲置时候做“预先”垃圾回收(提前做垃圾回收操作),保证一定数量的“备用空白块”,让 SSD 在运行时候能够保持较高的性能。闲置垃圾回收的缺点是会增加额外的“写入放大”,因为你刚刚垃圾回收的"有效数据",也许马上就会被更新后的数据替代而变成“无效数据”,这样就造成之前的垃圾回收做无用功了。

被动垃圾回收:每个 SSD 都支持的技术,但是对主控制器的性能提出了很高的要求,适合在服务器里用到,SandForce 的主控就属这类。在垃圾回收操作消耗带宽和处理能力的同时处理用户操作数据,如果没有足够强劲的主控制器性能则会造成明显的速度下降。这就是为啥很多 SSD 在全盘写满一次后会出现性能下降的道理,因为要想继续写入数据就必须要边垃圾回收边做写入。

手动垃圾回收:用户自己手动选择合适的时机运行垃圾回收软件,执行垃圾回收操作。

可以想象,如果系统经常进行垃圾回收处理,频繁的将一些区块进行擦除操作,那么 SSD 的寿命反而也会进一步下降。由此把握这个垃圾回收的频繁程度,同时确保 SSD 中的闪存芯片拥有更高的使用寿命,这确实需要找到一个完美的平衡点。所以,SSD 必须要支持 Trim 技术,不然 GC 就显不出他的优势了。

5.5Trim

Trim 是一个 ATA 指令,当操作系统删除文件或格式化的时候,由操作系统同时把这个文件地址发送给 SSD 的主控制器,让主控制器知道这个地址的数据无效了。当你删除一个文件的时候,文件系统其实并不会真正去删除它,而只是把这个文件地址标记为“已删除”,可以被再次使用,这意味着这个文件占的地址已经是“无效”的了。这就会带来一个问题,硬盘并不知道操作系统把这个地址标记为“已删除”了,机械盘的话无所谓,因为可以直接在这个地址上重新覆盖写入,但是到了 SSD 上问题就来了。NAND 需要先擦除才能再次写入数据,要得到空闲的 NAND 空间,SSD 必须复制所有的有效页到新的空闲块里,并擦除旧块(垃圾回收)。如果没有 Trim 指令,意味着 SSD 主控制器不知道这个页是“无效”的,除非再次被操作系统要求覆盖上去。

Trim 只是条指令,让操作系统告诉 SSD 主控制器这个页已经“无效”了。Trim 会减少写入放大,因为主控制器不需要复制“无效”的页(没 Trim 就是“有效”的)到空白块里,这同时代表复制的“有效”页变少了,垃圾回收的效率和 SSD 性能也提升了。Trim 能大量减少伪有效页的数量,它能大大提升垃圾回收的效率。目前,支持 Trim 需要三个要素,

(1)系统:操作系统必须会发送 Trim 指令,Win7, Win2008R2 , Linux-2.6.33 以上。

(2)固件:SSD 的厂商在固件里要放有 Trim 算法,也就是 SSD 的主控制器必须认识 Trim 指令。

(3)驱动:控制器驱动必须要支持 Trim 指令的传输,也就是能够将 Trim 指令传输到 SSD 控制器。MS 的驱动,Intel 的 AHCI 驱动目前支持。别的要看之后的更新了。

目前,RAID 阵列里的盘明确不支持 TRIM,不过 RAID 阵列支持 GC。

5.6 预留空间(Over-provisioning)

预留空间是指用户不可操作的容量,为实际物理闪存容量减去用户可用容量。这块区域一般被用来做优化,包括磨损均衡,GC和坏块映射。

第一层为固定的7.37%,这个数字是如何得出的哪?我们知道机械硬盘和 SSD 的厂商容量是这样算的,1GB 是1,000,000,000字节(10的9 次方),但是闪存的实际容量是每 GB=1,073,741,824,(2的30次方) ,两者相差7.37%。所以说假设1块 128GB 的 SSD,用户得到的容量是 128,000,000,000 字节,多出来的那个 7.37% 就被主控固件用做OP了。

第二层来自制造商的设置,通常为 0%,7%,28% 等,打个比方,对于 128G 颗粒的 SandForce 主控 SSD,市场上会有 120G 和 100G 两种型号卖,这个取决于厂商的固件设置,这个容量不包括之前的第一层 7.37% 。

第三层是用户在日常使用中可以分配的预留空间,用户可以在分区的时候,不分到完全的 SSD 容量来达到这个目的。不过需要注意的是,需要先做安全擦除(Secure Erase),以保证此空间确实没有被使用过。

预留空间的具体作用:

(1)垃圾回收:就是要把数据搬来搬去,那就需要始终有空的地方来放搬的数据。空的越多,搬的越快,多多益善,有些SSD为了更快,还会再拿走一些用户的容量。

(2)映射表等内部数据保存:SSD里面有一个巨大的映射表,把用户地址转成物理Flash颗粒地址,需要保存,以防掉电丢失。这个大概是千分之三的容量。

(3)坏块替换:写得多了,坏块会逐渐增加,需要用好的顶替。随着Flash的制程从32nm不断变小,变到现在的14nm,Flash质量越来越差,坏块越来越多,这部分可能会到3%甚至更多。

5.7 写入放大(Write amplification)

因为闪存必须先擦除(也叫编程)才能写入,在执行这些操作的时候,移动或覆盖用户数据和元数据(metadata)不止一次。这些额外的操作,不但增加了写入数据量,减少了SSD的使用寿命,而且还吃光了闪存的带宽,间接地影响了随机写入性能。这种效应就叫写入放大(Write amplification)。一个主控的好坏主要体现在写入放大上。

比如我要写入一个 4KB 的数据,最坏的情况是,一个块里已经没有干净空间了,但是有无效数据可以擦除,所以主控就把所有的数据读到缓存,擦除块,从缓存里更新整个块的数据,再把新数据写回去。这个操作带来的写入放大就是:我实际写4K的数据,造成了整个块(1024KB)的写入操作,那就是256倍放大。同时带来了原本只需要简单的写4KB的操作变成闪存读取(1024KB),缓存改(4KB),闪存擦(1024KB),闪存写(1024KB),造成了延迟大大增加,速度急剧下降也就是自然的事了。所以,写入放大是影响 SSD 随机写入性能和寿命的关键因素。

用100%随机4KB来写入 SSD,对于目前的大多数 SSD 主控而言,在最糟糕的情况下,写入放大的实际值可能会达到或超过20倍。当然,用户也可以设置一定的预留空间来减少写入放大,假设你有个 128G 的 SSD,你只分了 64G 的区使用,那么最坏情况下的写入放大就能减少约3倍。

许多因素影响 SSD 的写入放大。下面列出了主要因素,以及它们如何影响写入放大。

(1)垃圾回收虽然增加了写入放大(被动垃圾回收不影响,闲置垃圾回收影响),但是速度有提升。

(2)预留空间可以减少写入放大,预留空间越大,写入放大越低。

(3)开启 TRIM 指令后可以减少写入放大

(4)用户使用中没有用到的空间越大,写入放大越低(需要有 Trim 支持)。

(5)持续写入可以减少写入放大。理论上来说,持续写入的写入放大为1,但是某些因素还是会影响这个数值。

(6)随机写入将会大大提升写入放大,因为会写入很多非连续的 LBA。

(7)磨损平衡机制直接提高了写入放大

5.8 交错操作

交错操作可以成倍提升NAND的传输率,因为NAND颗粒封装时候可能有多Die、多Plane(每个plane都有4KB寄存器),Plane操作时候可以交叉操作(第一个plane接到指令后,在操作的同时第二个指令已经发送给了第二个plane,以此类推),达到接近双倍甚至4倍的传输能力(看闪存颗粒支持度)。

5.9 ECC

ECC的全称是Error Checking and Correction,是一种用于Nand的差错检测和修正算法。由于NAND Flash的工艺不能保证NAND在其生命周期中保持性能的可靠,因此,在NAND的生产中及使用过程中会产生坏块。为了检测数据的可靠性,在应用NAND Flash的系统中一般都会采用一定的坏区管理机制,而管理坏区的前提是能比较可靠的进行坏区检测。如果操作时序和电路稳定性不存在问题的话,NAND Flash出错的时候一般不会造成整个Block或是Page不能读取或是全部出错,而是整个Page中只有一个或几个bit出错,这时候ECC就能发挥作用了。不同颗粒有不同的基本ECC要求,不同主控制器支持的ECC能力也不同,理论上说主控越强ECC能力越强。

参考:http://www.jinbuguo.com/storage/ssd_intro.html

http://www.ssdfans.com/?p=131

目录

SSD优点

SSD缺点

SATA

mSATA(miniSATA)

PCI-E

M.2

主控

固件算法

NAND闪存颗粒

SLC模拟缓存

TRIM

磨损平衡

3D-NAND

SSD发展历程

SSD内部结构:主控芯片、闪存芯片、固件算法

SSD硬盘接口

AHCI协议和NVMe协议

SSD优缺点

传统的机械硬盘(HDD)运行主要是靠机械驱动头,包括马达、盘片、磁头摇臂等必需的机械部件,它必须在快速旋转的磁盘上移动至访问位置,至少95%的时间都消耗在机械部件的动作上。SSD却不同机械构造,无需移动的部件,主要由主控与闪存芯片组成的SSD可以以更快速度和准确性访问驱动器到任何位置。传统机械硬盘必须得依靠主轴主机、磁头和磁头臂来找到位置,而SSD用集成的电路代替了物理旋转磁盘,访问数据的时间及延迟远远超过了机械硬盘。SSD有如此的“神速”,完全得益于内部的组成部件:主控、闪存、固件算法。

SSD发展历程

SSD发展主要围绕颗粒类型、容量大小、封装缓存技术等进行。

SSD内部结构:主控芯片、闪存芯片、固件算法

主控

SSD主控本质是一颗处理器,类似于电脑CPU,主要基于ARM架构,也有部分SSD厂家的主控采用RISC架构,使其具备CPU级别的运算能力。其具体作用表现在:一是合理调配数据在各个闪存芯片上的负荷,让所有的闪存颗粒都能够在一定负荷下正常工作,协调和维护不同区块颗粒的协作,二是承担了整个数据中转,连接闪存芯片和外部SATA接口,三是负责固态硬盘内部各项指令的完成,诸如trim、CG回收、磨损均衡。

一款主控芯片的好坏直接决定了固态硬盘的实际体验和使用寿命。主控芯片的技术门槛较高,所以主控品牌比较少,目前主流主控品牌有慧荣、群联、Marvell、三星。

慧荣/群联:慧荣和群联是两家台湾主控公司,其主控成本低廉,受到很多国产SSD的欢迎,涉及厂家包括但不限于:浦科特、七彩虹、影驰、台电、光威、铭瑄等。

Marvell主控:Marvell隶属于高端系列,早期产品只用于企业级,现在应用在浦科特、闪迪、英睿达固态硬盘中。技术实力雄厚,主控质量稳定,但是相应的固态硬盘的价格也比较昂贵。

三星主控:三星主控只用在自家的SSD产品中,技术实力强悍。可以这么说,在SATA接口SSD中,三星860PRO读写速度最快,在NVMe固态硬盘中,三星960PRO读写速度最快。

瑞昱主控:同样是台系品牌,是一家新晋主控品牌,七彩虹部分SSD采用瑞昱主控方案。

固件算法

SSD固件是确保SSD性能的非常重要的一部分,主要用于驱动控制器。固件冗余存储至NAND闪存中,主控使用固件算法中的控制程序,去执行自动信号处理,耗损平衡,错误校正码(ECC),坏块管理、垃圾回收算法、与主机设备(如电脑)通信,以及执行数据加密等任务。当SSD制造商发布一个固件更新时,需要手动更新固件来改进和扩大SSD的功能。

一款固态硬盘中颗粒对性能的影响约为60%,而固件的影响就会占到20%以上。高品质算法优秀的固件不仅仅是一项非常艰难的工作,而且也需要让闪存和主控之间达到完美的兼容,需要掌握闪存颗粒和主控等多项先进的技术 。固件的品质越好,整个SSD的品质也就越出色。

能够独立开发固件的SSD厂商少,仅有三星、Intel、闪迪、英睿达、浦科特、东芝等,这是大厂带来的技术优势。

NAND闪存颗粒

闪存颗粒有很多不同的变种,固态硬盘最为常用的是NAND闪存颗粒。

NAND闪存分类(根据电子单元密度大小划分):SLC(单层次存储单元)、MLC(双层存储单元)、TLC(三层存储单元)以及QLC(四阶存储单元)

通过对闪存内最小的物理存储单元的电位划分不同的阶数,可以在一个存储单元内存储一至多个二进制位数。即SLC一个单元只有两种状态(0或1)储存一位信息;MLC中一个单元有四种状态(00/01/10/11)储存两位信息。每个存储单元存储的二进制位数越多,寿命越短。(电压阈值较低可靠性差)

SLC模拟缓存

应对突发IO,主要是应对突发写入、免除等待。是无独立缓存时代的解决方案,牺牲一定的容量换取短暂的高性能;缓存大小可通过主控动态分配

TRIM

微软提出,因FLASH不支持实时覆盖写入而生,必须清空后才能使用。操作系统删除文件,发送指令给主控,相关数据区域被标记,后台根据实际情况进行数据清理(由固件决定实时清理还是延迟清理),TRIM指令默认都打开,打开后能一定程度保证写入性能。TRIM指令导致SSD数据误删除后难以恢复。

磨损平衡

减缓区域性的过度重复磨损;擦除次数实时预警

动态WL、静态WL、全局WL

3D-NAND

随着NAND制程越来越小,缩短制程提高存储密度已经非常困难。最新的NAND技术被称为3D-NAND,这种材料改变了2D-NAND单层的设计,将32层、64层NAND进行堆叠,从而提高存储密度。

SSD硬盘接口

SATA

SATA这个词是Serial ATA(Serial Advanced Technology Attachment)串行ATA的缩写,这是一种电脑总线,用于数据传输。在此之前广泛应用的是PATA,也就是Parallel ATA,并行ATA,在硬盘领域对应着IDE硬盘,相信不少用户在BIOS设置中,能够看到IDE这样的字样。SATA取代PATA,主要是传输速率的提升,具备更强的纠错能力以及更加稳定。

SATA的更新版本主要有SATA1.0、SATA2.0和SATA3.0。而在SATA的基础上,还研发出了一些相关的接口,比如SATA-E、mSATA等接口,甚至就连SAS接口也兼容了SATA。

和内存一样,SATA接口也拥有着向下兼容的特点,即SATA 3的硬盘可以插在SATA 2的接口上使用,但值得注意的一点是,如果是机械硬盘,这样操作问题不大,因为机械硬盘的传输速率还没有超过SATA 2的性能上限,所以插上后没什么影响。但如果是固态硬盘就不行了,sata固态硬盘动辄480~560MB/s的传输速率,已经超过了SATA 2,所以如果是SATA3接口的固态硬盘插在SATA 2接口上,那固态硬盘的传输速率就会大幅下降到200多MB/s。

版本 带宽 理论速度
SATA Express 16Gb/s 1.97 GB/s
SATA 3.0 6Gb/s 600MB/s
SATA 2.0 3Gb/s 300MB/s
SATA 1.0 1.5Gb/s 150MB/s

2.5英寸SATA接口固态硬盘:7+15针

SATA数据接口(7针)电源接口(15针)定义详解 参考文章(https://blog.csdn.net/u013000139/article/details/50371568)

SATA数据接口和电源接口

数据接口(7针)定义

电源接口(15针)定义

mSATA(miniSATA)

早期,为了更适应于超极本这类超薄设备的使用环境,针对便携设备开发的mSATA(mini SATA)接口应运而生。你可以把它看作标准SATA接口的mini版,物理接口跟mini PCIe接口一样。mSATA接口是SSD小型化的一个重要过程,不过mSATA依然没有摆脱SATA接口依然是SATA通道,速度是6Gbps。诸多原因没能让mSATA 接口火起来,反而被更具升级潜力的M.2 SSD所取代。

mSATA接口固态硬盘:8+18针

PCI-E

PCI-Express (peripheral component interconnect express),是一种高速串行计算机扩展总线标准,它的主要优势就是数据传输速率高。在传统SATA硬盘中,当我们进行数据操作时,数据会先从硬盘读取到内存,再将数据提取至CPU内部进行计算,计算后再反馈给内存,最后写入至硬盘中;而PCIe接口数据直接通过总线与CPU直连,传输效率与速度都成倍提升。

PCIE有四种接口尺寸:X1/X4/X8/X16,版本有1.0/2.0/3.0

我们通过用胶带覆盖显卡PCI-E接口金手指的方法来屏蔽,由于PCI-E每个通道彼此互相独立,并且支持通道数量向下兼容(如果x16设备插在x1槽上,则自动降为x1)。

M.2

M.2原名是NGFF接口,这是为超极本(Ultrabook)量身定做的新一代接口标准,主要用来取代mSATA接口。不管是从非常小巧的规格尺寸上讲,还是说从传输性能上讲,这种接口要比mSATA接口好很多。正是因为SATA的接口瓶颈越来越突出,现在很多主板厂商都开始在产品线上预留出M.2接口。

M.2接口能够同时支持PCI-E通道以及SATA,其中前者在提高速度方面更轻松一些。最开始该接口所采用的是PCI-E 2.0 x2通道,理论带宽10Gbps,可以说它也突破了SATA接口理论传输瓶颈。如今的M.2接口全面转向PCI-E 3.0 x4通道,理论带宽达到了32Gbps,相比以往水准提升了很多,这也让SSD性能潜力大幅提升。另外,该接口固态硬盘还支持NVMe标准,和现在的AHCI比较起来,通过新的NVMe标准接入的SSD,在性能提升方面非常明显。

虽然现在M.2的SSD已经铺天盖地了,但在买的时候,一定要注意M.2接口分为B key(Socket 2)M key(Socket 3)两个模组,它们由于金手指缺口和针脚数量的不同而容易产生兼容问题。简单来说,B key是在左边留有6个针脚后缺了一个口子,而M key则是在右边有5根针脚后才有缺口。不过厂商们为了减少主板(含笔记本)烧毁几率,现在都用同时兼容B key和M key的接口。

AHCI协议和NVMe协议

AHCI是对应SATA接口的协议,使用时需要在主板中开启AHCI模式;NVMe是针对PCIE开发的新协议。

NVMe控制器通过几种不同的方式提高性能。一种是使用PCIe总线,它将存储直接连接到系统CPU。这种直接连接消除了SATA的一些必要步骤,并提高了整体性能。此外,NVMe SSD在很大程度上实现了并行性,极大地提高了吞吐量。

只有SSD运行在NVMe上

因为NVMe驱动器要比SATA快得多,所以将NVMe与HDD放在一起使用来提高性能似乎是个好主意。但是请记住,NVMe代表非易失性存储接口规范,它是专门为NAND 闪存等非易失性存储设计的(尽管它也可以用于较新的非易失性内存,比如3D XPoint)。

当系统从HDD读取数据时,它一次只能读取一块数据。因为它必须进行旋转以定位到第一个数据块的正确物理位置,然后再次旋转,移动到第二个数据块的正确位置,以此类推。另一方面,闪存和其他非易失性存储技术没有移动部件。这意味着系统可以同时从许多不同的位置读取数据。这就是为什么SSD可以利用NVMe提供的并行性,而HDD不能。

NVMe是一种协议,是一组允许SSD使用PCIe总线的软硬件标准,而PCIe是实际的物理连接。当您将一个NVMe SSD插入服务器时,您需要通过一个PCIe插槽连接它。

SSD优缺点

SSD优点

没有移动的机械组件,更能抵抗物理冲击,无声运行

访问时间短,延迟低

SSD缺点

所有SSD仍然以电荷存储数据,如果没有电源,它会随着时间的推移而慢慢泄漏。这导致磨损的驱动器(超过其耐久性等级)通常在一个(如果存储在30°C)到两个(25°C)存储时间后开始丢失数据。

提高每单元比特数增加了容量并降低了成本,但可靠性耐久性较差。


参考文献

干货!史上最全SSD科普贴

博客:SSD固态硬盘的结构和基本工作原理概述

b站视频:关于SSD固态硬盘,你真的了解吗?

SSD接口种类

SATA、mSATA 、PCIe和M.2——SSD硬盘的接口

知乎:如何选购固态硬盘

什么是NVMe?一篇文章理清它的前生今世

SSD基本工作原理

SSD 主要由 SSD 控制器,FLASH 存储阵列,板上DRAM(可选),以及跟HOST接口(诸如SATA,SAS, PCIe等)组成。

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数据。

一张Map Table有多大呢?这里假设我们有一个256GB的SSD,以4KB Host Page为例,那么一共有约 64M(256GB/4KB)个Host Page,也就意味着SSD需要有64M大小的Map Table。Map Table中的每个Entry存储的就是物理地址(Physical Page Address),假设其为4Byte (32 bits) ,那么整个Map Table的大小为64M*4B = 256MB。

对绝大多数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写操作。当整个SSD写满后,从用户角度来看,如果想写入新的数据,则必须删除一些数据,然后腾出空间再写。用户在删除和写入数据的过程中,会导致一些Block里面的数据变无效或者变老。如下图所示(绿色小方块代表有效数据,红色小方块代表无效数据):

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。

对空盘来说,写放大一般为1,即Host写入多少数据,写入FLASH也是多少数据量。在Sandforce控制器出来之前,写放大最小值为1。但是由于Sandforce内部具有压缩模块,它能对Host写入的数据进行实时压缩,然后再把它们写入到NAND。举个例子,HOST写入8KB数据,经压缩后,数据变为4KB,如果这个时候还没有垃圾回收,那么写放大就只有0.5。Intel之前说写放大不可能小于1,但Sandforce打破了这个说法。

说完写放大,再谈谈预留空间(OP, Over Provisioning)。

假设一个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=1*1024*1024*1024Byte。256GB FLASH 为256*(2^30) Byte,而一般说的256GB SSD 容量为256*(10^9) Byte,这样,天然的有(256*(2^30)-256*(10^9))/(256*(10^9)) = 7.37%的OP。

如果把256GB Flash容量的SSD配成240GB的,那么它的OP是多大呢? (256*(2^30)-240*(10^9))/(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*(2^30)的空间,每个Block上面的平均有效数据率可以认为是256*(10^9)/256*(2^30) = 93.1%。

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

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

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

WL有两种算法:动态WL和静态WL。所谓动态WL,就是在使用Block进行擦写操作的时候,优先挑选PE 数低的;所谓静态WL,就是把长期没有修改的老数据(如前面提到的只读文件数据)从PE数低的Block当中搬出来,然后找个PE 数高的Block进行存放,这样,之前低PE数的Block就能拿出来使用。

下面这张图诠释了无WL,动态WL和静态WL下的FLASH耐久度的区别 (假设每个Block最大PE数为10,000):

可见,使不使用WL,以及使用何种WL算法,对SSD的寿命影响是很大的。

小结:本文介绍了SSD的一些基本原理,包括SSD底层FLASH阵列的实现,Host Page与Physical Page的映射及映射表,垃圾回收机制,写放大,OP和Wear Leveling等。虽然市面上有各种各样的SSD,但它们内部这些基本的东西都是相通的。理解了这些东西,就等于拥有了一把通向SSD世界的钥匙。

我们都知道,早期的电脑CPU是可以直接从硬盘上面读取数据进行处理的,随着科技的进步,时代的发展,计算机硬件的发展速度也是极其迅猛。CPU主频的不断提升,从单核到双核,再到多核;CPU的处理速度越来越快,而硬盘的的读写速度已经远远跟不上CPU的读写速度,后来增加了内存这个读写速度相对较快的缓存,而内存也是蓬勃到发展,从SDRAM到DDR,从DDR到DDR2再到DDR3,但是无论怎样,内存缓存速度还是跟不上CPU的运算处理速度,后来便在CPU中增加了快速缓存机制!而硬盘这个持久化存储器呢?之前的文章,聊到了机械硬盘的结构和工作原理,今天就来聊一聊SSD固态硬盘的结构和基本工作原理,如理解有所变差,或文章有所不足,皆因水平所限!

硬盘的发展在不断的科技进步中快速提升,从容量以及速度再到接口方面。从早期的PATA变成SATA,SCSI变到SAS,以及垂直记录技术在容量上的突破,但这些进步亦未能改变磁盘的记录方式。随着人们对数据需求增多,存储系统的瓶颈越来越明显。而在嵌入式领域移动设备和工业自动化控制等恶劣环境下,传统硬盘机械结构已经无法满足要求,而所有这一切随着固态存储(SSD)的到来而发生了改变。

传统的机械硬盘(HDD)运行主要是靠机械驱动头,包括马达、盘片、磁头摇臂等必需的机械部件,它必须在快速旋转的磁盘上移动至访问位置,至少95%的时间都消耗在机械部件的动作上。SSD却不同机械构造,无需移动的部件,主要由主控与闪存芯片组成的SSD可以以更快速度和准确性访问驱动器到任何位置。传统机械硬盘必须得依靠主轴主机、磁头和磁头臂来找到位置,而SSD用集成的电路代替了物理旋转磁盘,访问数据的时间及延迟远远超过了机械硬盘。SSD有如此的“神速”,完全得益于内部的组成部件:主控--闪存--固件算法。

主控、闪存及固件算法三者的关系:

SSD最重要的三个组件就是NAND闪存,控制器及固件。NAND闪存负责重要的存储任务,控制器和固件需要协作来完成复杂且同样重要的任务,即管理数据存储、维护SSD性能和使用寿命等。

主控:

控制器是一种嵌入式微芯片(如电脑中CPU),其功能就像命令中心,发出SSD的所有操作请求----从实际读取和写入数据到执行垃圾回收和耗损均衡算法等,以保证SSD的速度及整洁度,可以说主控是SSD的大脑中枢。目前主流的控制器有Marvell、SandForce、Samsung、Indilinx等。像Marvell各方面都很强劲,代表型号为Marvell 88SS9187/89/90主控,运用在浦科特、闪迪、英睿达等品牌的SSD上。

SandForce的性能也不错,它的特点是支持压缩数据,比如一个10M的可压缩数据可能被他压成5M的写入硬盘,但还是占用10M的空间,可以提高点速度,最大的特点是会延长SSD的寿命,但是CPU占用会高点而且速度会随着硬盘的使用逐渐小幅度降低。代表型号为SF-2281,运用在包括Intel、金士顿、威刚等品牌的SSD上。

Samsung主控一般只有自家的SSD上使用,性能上也是很强悍的,不会比Marvell差多少。目前三星主控已经发展到第五代MEX,主要运用在三星850EVO、850PRO上。

固件算法:

SSD的固件是确保SSD性能的最重要组件,用于驱动控制器。主控将使用SSD中固件算法中的控制程序,去执行自动信号处理,耗损平衡,错误校正码(ECC),坏块管理、垃圾回收算法、与主机设备(如电脑)通信,以及执行数据加密等任务。由于固件冗余存储至NAND闪存中,因此当SSD制造商发布一个更新时,需要手动更新固件来改进和扩大SSD的功能。

开发高品质的固件不仅需要精密的工程技术,而且需要在NAND闪存、控制器和其他SSD组件间实现完美整合。此外,还必须掌握NADN特征、半导体工艺和控制器特征等领域的最先进的技术。固件的品质越好,整个SSD就越精确,越高效,目前具备独立固件研发的SSD厂商并不多,仅有Intel/英睿达/浦科特/OCZ/三星等厂商,希望我国能早日解决。

NAND闪存:

SSD用户的数据全部存储于NAND闪存里,它是SSD的存储媒介。SSD最主要的成本就集中在NAND闪存上。NAND闪存不仅决定了SSD的使用寿命,而且对SSD的性能影响也非常大。NAND闪存颗粒结构及工作原理都很复杂,接下来我们会继续推出系列文章来重点介绍闪存,这里主要来了解一下大家平常选购SSD经常接触到的SLC、MLC及TLC闪存。

SLC/MLC/TLC闪存:

三种闪存状态

这几年NAND闪存的技术发展迅猛同,从企业级标准的SLC闪存到被广泛运用在消费级SSD上的MLC闪存再到目前正在兴起的TLC闪存,短短时间里,我们看到NAND技术显著进步。对SLC、MLC及TLC闪存怎么理解呢?简单来说,NAND闪存中存储的数据是以电荷的方式存储在每个NAND存储单元内的,SLC、MLC及TLC就是存储的位数不同。

单层存储与多层存储的区别在于每个NAND存储单元一次所能存储的“位元数”。SLC(Single-Level Cell)单层式存储每个存储单元仅能储存1bit数据,同样,MLC(Multi-Level Cell)可储存2bit数据,TLC(Trinary-Level)可储存3bit数据。一个存储单元上,一次存储的位数越多,该单元拥有的容量就越大,这样能节约闪存的成本,提高NAND的生产量。但随之而来的是,向每个单元存储单元中加入更多的数据会使得状态难以辨别,并且可靠性、耐用性和性能都 会降低。

一颗NAND芯片是32G的容量,也就是说128G的SSD,内部是5个NAND芯片做并行读取。读写的时候都依靠主控芯片来做控制,主控芯片还要对所有的NAND闪存芯片做磨损平衡,保证这帮兄弟要挂一起挂,假如是256G的,内部是8通道,并发的读写能力比128G会有了接近50%的提升。至于再大的容量,因为存储容量过大,导致主控芯片保存的地址映射表过大,性能可能会出现持平甚至下降的情况。

固态硬盘是无需移动的固态电子元件,可以直接进行数据读取。具体量化的概念就是,一台笔记本电脑在使用传统硬盘时可能需要等待36秒才能让操作系统完成启动,而现在如果使用固态硬盘,则只需等待不到9秒钟。基于这种高性能硬盘的协同工作,CPU的运行效率也会提高,其节省能耗的优点足以使电池延长15%的寿命,而且它更加抗震和轻便。而传统硬盘在读取及写入数据的时候,硬盘磁头需要花费时间转动并找到数据所在的位置。

工作原理概述

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通道连接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;当读取某个HostPage时, SSD首先查找Map Table中该Host Page对应的Physical Page,然后再访问Flash读取相应的Host数据。

一张Map Table有多大呢?这里假设我们有一个256GB的SSD,以4KB Host Page为例,那么一共有约 64M(256GB/4KB)个Host Page,也就意味着SSD需要有64M大小的Map Table。Map Table中的每个Entry存储的就是物理地址(Physical Page Address),假设其为4Byte (32bits) ,那么整个Map Table的大小为64M*4B = 256MB。对绝大多数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写操作。当整个SSD写满后,从用户角度来看,如果想写入新的数据,则必须删除一些数据,然后腾出空间再写。用户在删除和写入数据的过程中,会导致一些Block里面的数据变无效或者变老。如下图所示(绿色小方块代表有效数据,红色小方块代表无效数据):

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)。

垃圾回收原理

再看一下这张图。回收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*2^30的空间,每个Block上面的平均有效数据率可以认为是256*10^9/256*2^30 = 93.1%。 

 如果配成240GB的SSD,则意味着240*10^9的有效数据写到256*2^30的空间,每个Block的平均有效数据率为240*10^9/256*2^30 = 87.3%。

OP越大,每个Block平均有效数据率越小,因此我们可以得出的结论:OP越大,垃圾回收越快,写放大越小。这就是OP大的好处。

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

WL有两种算法:动态WL和静态WL。所谓动态WL,就是在使用Block进行擦写操作的时候,优先挑选PE 数低的;所谓静态WL,就是把长期没有修改的老数据(如前面提到的只读文件数据)从PE数低的Block当中搬出来,然后找个PE 数高的Block进行存放,这样,之前低PE数的Block就能拿出来使用。

下面这张图(来源网络)诠释了无WL,动态WL和静态WL下的FLASH耐久度的区别 (假设每个Block最大PE数为10,000):

(0)

相关推荐