SSD 主要由 SSD 控制器,Flash 存储阵列,板上 DRAM 和 HOST 接口(SATA、SAS、PCIe 等)组成
闪存基础
Flash 的基本存储单元是浮栅晶体管,工作原理和场效应管类似,都是利用电压控制源极和漏极之间的通断来工作的
- 写操作是在控制极加正电压,使电子通过绝缘层进入浮栅极。因此写操作无法将电子从浮栅极吸出,所以覆盖写入时必须先擦除。
- 擦除操作正好相反,是在衬底加正电压,把电子从浮栅极中吸出来
- 读操作给控制栅加读取电压,判断漏极-源极之间是否处于导通状态,进而可以判断浮置栅有没有存储电荷,从而得到 0 或 1
SSD 硬件构成
-
主机接口主要负责与主机进行通信和数据传输,常见的有PCIe接口和NVMe协议、SATA物理接口和AHCI协议。
-
控制器是SSD“大脑”,包含嵌入式多核处理器,执行闪存转换层(flash translation layer, FTL)固件算法,包括I/O请求调度、数据缓存、地址映射/转换、垃圾回收、损耗均衡等,并负责闪存芯片控制与数据纠错(error correction code, ECC)。DRAM内存用于缓存数据和FTL元数据。
-
闪存存储采用多级并行架构,一般而言,包含多个通道(如8或16个),每个通道通过闪存总线连接多个闪存芯片 Chip(如8或16个),每个芯片内部包含几个晶圆Die(如8或16个),每个晶圆由几个分组Plane组成(如4或6个),每个分组包含大量闪存块 Block(如1024个),每个块包含大量闪存页 Page(如2048个),闪存页大小为16KB或32KB。
- NAND-flash -> Die -> Plane -> Block -> Page
- Die是独立执行闪存命令的基本并行单元,一个 Die内的多个分组也支持同时执行某一种闪存命令。闪存的操作特征在于,以 Page为单位进行读和写,以 Block为单位进行擦除,读、写、擦除延迟分别为几十上百微秒、几百上千微秒、几毫秒;而且,Block在写入之前必须先擦除,块内的 Page 必须顺序写入。
-
所有 Chips 上的所有 Plane 上的同一偏移量的 Block 被组织成一个 Superblock,SSD 每次会打开一个 Superblock 来进行追加写,这样会让纠错更加高效。
存储原理
NAND 的一个特性是读写必须以 Page 为单位
NAND 的另一个特性覆盖写必须先清空 Page 的内容,再进行写入(先擦除再写)并且由于清空内容的电压较高,必须以 Block 为单位进行擦除(为了提高效率)
SSD 中会维护一个 mapping table,维护逻辑地址到物理地址的映射,与传统机械硬盘相比,省去了寻道时间和旋转时间
SSD 读写流程
与 HDD 的比较
在顺序读测试中,由于定位数据只需要一次,定位之后,则是大批量的读取数据的过程,此时,HDD和SSD的性能差距主要体现在读取速度上,HDD能到200M左右,而普通SSD是其两倍。
在随机读测试中,由于每次读都要先定位数据,然后再读取,HDD的定位数据的耗费时间很多,一般是几毫秒到十几毫秒,远远高于SSD的定位数据时间(一般0.1ms左右),因此,随机读写测试主要体现在两者定位数据的速度上,此时,SSD的性能是要远远好于HDD的。
新写入
- 找到一个空闲Page H。
- 数据写入到空闲Page H。
- 更新mapping table。
更新写
- SSD不能覆盖写,因此先找到一个空闲页H。
- 读取Page G中的数据到SSD内部的buffer中,把更新的字节更新到buffer。
- buffer中的数据写入到 Page H。
- 更新mapping table中 Page G,置为无效页。
- 更新mapping table中 Page H,添加映射关系。
GC
SSD GC操作的有效数据迁移过程为:
- (1) 控制器从闪存超级块中读取有效数据页,进行ECC解码,完成检错纠错;
- (2) 将数据页缓存到DRAM;
- (3) 触发缓存下刷,将数据页传输到控制器,进行ECC编码;
- (4) 将编码后的数据页写到空闲超级块。
- 上图展示了这个过程,但存在纰漏,忽略了第 (3) 步。
OP 空间
Over-Provisioning
是指SSD实际的存储空间比可写入的空间要大,OP 空间要用来做 GC
SSD的GC机制会带来两个问题:
- SSD的寿命减少。NAND-Flash中每个原件都有擦写次数限制,超过一定擦写次数后,就只能读取不能写入了。
- 写放大(Write Amplification)。即内部真正写入的数据量大于用户请求写入的数据量。
如果频繁的在某些Block上做GC,会使得这些元件比其他部分更快到达擦写次数限制。因此,需要损耗均衡控制(Wear-Leveling)算法,使得原件的擦写次数比较平均,进而延长SSD的寿命。
Trim 机制
Trim
指令也叫 Disable Delete Notify
(禁用删除通知),是微软联合各大SSD厂商所开发的一项技术,属于ATA8-ACS规范的技术指令。
Trim(Discard)的出现主要是为了提高GC的效率以及减少写入放大的发生,最大作用是清空待删除的无效数据。
通常SSD掉速很大一部分原因就是待删除的无效数据太多,每次写入的时候主控都要先做清空处理,所以性能受到了限制。
在文件系统上删除某个文件时候,简单的在逻辑数据表内把存储要删除的数据的位置标记为可用而已,而并不是真正将磁盘上的数据给删除掉。使用机械硬盘的系统根本就不需要向存储设备发送任何有关文件删除的消息,系统可以随时把新数据直接覆盖到无用的数据上。固态硬盘只有当系统准备把新数据要写入那个位置的时候,固态硬盘才意识到原来这写数据已经被删除。而如果在这之前,SSD执行了GC操作,那么GC会把这些实际上已经删除了的数据还当作是有效数据进行迁移写入到其他的Block中,这是没有必要的。
Trim 命令的用途,表面上仅是告诉SSD:”某段LBA空间的数据对我不再有用了,你看着办吧“,隐含的意思是这样的:”你别再把这些数据搬来搬去了,直接扔掉,擦掉就最好了。”
Trim 一般涉及到后台 GC,一般是 log 住 Trim 命令,然后异步执行相应的修改
- Non-Deterministic TrimFW完全不需要保证每次读Trimmed LBA 回一样的数据,可以是0,也可以是老数据,完全符合标准!而且实际上文件系统基本不会去读被Trimmed过的LBA.
- Deterministic Trim(DRAT)
- Deterministic Read Zero after TRIM (RZAT):保证 Trim 后读到的是全 0 数据,因为 Trim LBA 的 range 必须支持到 512 B 级别,那么对于一个小于一页的写会有写放大,一般的 SSD 就选择忽略这么小的写,那么就不再满足 RZAT 了