固态硬盘(SSD Solid-state Drive)是一种采用固态电子存储芯片阵列构成的非易失性存储设备,与传统的机械硬盘相比,SSD以其快速的读写速度和较高的可靠性而受到青睐。SSD的核心组成部分包括控制器(主控制器)和存储芯片。存储芯片主要分为动态随机存取存储器(DRAM)和闪存(FLASH)两种类型。
尽管DRAM固态硬盘在特殊应用领域偶有出现,但由于其易受电源稳定性影响的易失性特点以及成本考量,目前市场上的SSD产品大多不再采用DRAM作为主要存储介质。相反,NAND型闪存(NAND FLASH)因其较高的存储密度、较快的写入速度以及较低的成本,已成为SSD的主流存储介质。
SSD的发展可以追溯到1978年,当时世界上第一块SSD是基于RAM技术的。在现代SSD中,DRAM芯片仍然发挥着重要作用,但其功能已从主要存储介质转变为缓存使用。DRAM缓存能够提高数据传输效率,尤其是在处理大量数据读写操作时。SSD的内部结构相对简单,通常由一块印刷电路板(PCB)构成,其上装配有控制芯片、缓存芯片(并非所有SSD都配备缓存芯片),以及作为存储核心的FLASH芯片。
本文主要介绍的是 NAND Flash SSD。
Definitions
- Cell 被认为是 NAND Flash 的基本存储单元,早期 SLC SSD 中,简单理解一个 cell 就是0/1 两个状态代表数据二进制。当浮栅充电时,它被识别为“编程”状态并标记为0。当浮栅没有电荷时,它被识别为“擦除”状态并标记为1。 浮栅内部捕获的电子数量与单元晶体管的阈值电压成正比。若捕获大量电子,晶体管则实现高阈值电压;若捕获少量电子,则形成低阈值电压。 如果周围的电路没有改变,浮栅处于绝缘状态,其存储的电荷就保持状态不变,即使器件断电后数据也不会丢失。因此,NAND闪存便具备了非易失性。 然而,NAND闪存每个单元的编程/擦除(Program/Erase,简称P/E)次数是有限的。在电压作用下,电子在硅衬底和浮栅之间穿过氧化物实现移动的过程,称作“隧穿”。这个过程会造成隧道氧化层上的应力并且逐步破坏氧化层,因此浮栅最终将无法保持电荷,届时闪存单元也无法使用,将被归入坏块池。
-
Package:SSD 拆开的实物图中 NAND Flash 黑色的一个部分就称为一个 Package,每个Package里面会包含多个Die。
-
颗粒(Die):一个颗粒是一块硅片,包含一个阵列的 cell arrays。颗粒之下依次还有平面(Plane)、块(Block)、页(Page)等存储层级。
-
面(Plane):每个Plane都是由数百乃是数千个Block页组成的。每个plane都有独立的 page register 和 cache register。
-
页(Page):最小的读写单元。一个页通常包含数据区域和附加的元数据区域(如存储校验和或错误校正码的空间)。NAND Flash的页大小可以不同,常见的有4KB、8KB、16KB等。
-
块(Block):也叫擦除单元,擦除的最小单位。一般包含 64或128等个数的页。
-
擦除:把对应区域的数据“清空” 的过程,NAND 中会将块内所有数据位设置为1(在NAND Flash中表示未编程状态)
-
磨损:当闪存被反复擦除和写入时,就会发生磨损,此时可以认为磨损的部分 cell 损坏。随着时间的推移和使用频率的增加,不同 cell 磨损会累积,最终导致无法修复或可用块不足。
-
坏块:当 SSD 内部认为某个块无法可靠的存储数据时(磨损过多、ECC 错误校正码无法修复等),会将其标记为坏块。
-
预留空间:SSD 通常实际大小要比用户看到的大一些(如 7%),这部分预留空间会用来做垃圾回收、数据迁移、坏块替换等。
DataFlow
上图【SSD 系统调用】中文件系统是非必需的,相关存储数据软件系统只要自行管理 SSD 的逻辑地址到用户数据地址映射即可,文件系统只是其中最流行的一种实现。
操作系统驱动和 SSD 接口会以约定的接口形式通信。SATA 目前更多用于个人用途;SCSI 一般用于企业专业级的存储服务器中心,较完整定义了从磁盘协议、通信协议、数据访问协议一整套栈;NVMe over PCIe 目前则是企业级通用存储的最流行解决方案,只定义了 PCIe 接口本身,不直接参与网络通信、数据访问等其他流程。
SSD 可以粗分为三个大模块:
-
前端接口协议(与主板接口、OS 驱动适配)
-
Flash Translation Layer (一般简称 FTL)
-
后端和闪存 Flash 通信/管理的模块
IO Path & Erasure
SSD 收到主机从接口发过来的数据,FTL 会为数据分配闪存地址来构建 “SSD 逻辑地址”到“闪存物理地址映射”。新写的数据在闪存地址映射完后,会先存到 SSD RAM 攒批。攒够一定数量后(或者其他 trigger 如掉电保护等),FTL 会发写请求给 SSD 后端,后端把写请求从 RAM 写到闪存对应地址中。
闪存是不支持直接覆盖写的,FTL 无法在有数据的页上执行写入,而会每次分配干净的没有数据的页用于数据写入,并存储到映射表中。
一个对 4KB 页的小型 SSD 的映射表大小估算示例:
因为不支持覆盖写的机制,一些旧的不再需要的页则需要进行垃圾回收(GC),SSD 会在后台进行 GC 动作。
-
FTL 控制器持续监控存储在NAND Flash上的数据,识别那些已经变得碎片化的数据块。
-
当满足特定条件时(如剩余空闲空间低于某个阈值,或者系统空闲时),垃圾回收过程被触发。
-
选择那些部分填充且包含可回收数据的块作为垃圾回收的目标,将目标块中仍然活跃的数据迁移到新的、干净的数据块中。这个过程可能包括数据的读取、错误校正和重新写入。
-
更新逻辑到物理地址的映射表,确保数据访问请求被正确地重定向到新的数据块。
-
在数据迁移完成后,擦除原来的旧块,使其变为干净的空闲块,准备再次使用。
-
如果在垃圾回收过程中发现坏块,则会将数据迁移到好的块,并将坏块标记为不可用。
垃圾回收通常会引入磨损均衡策略来保证块的平均磨损度,总体策略思想就是在选择新的干净页的时候尽可能选择擦写次数少的页。策略包括但不限于:垃圾回收选择旧页的策略加入擦写次数阈值监控、引入机器学习等智能算法、写入选择擦写次数少的或者打散随机化等。
垃圾回收有以下好处:
-
通过合并小块的空闲空间,垃圾回收可以创建更大的连续空闲区域,这对于大文件的存储和性能优化是有益的。
-
通过有效地回收和重用空间,垃圾回收有助于减少写入放大,即实际写入到SSD的数据量大于用户数据量。
Read Disturb
读干扰(Read Disturb,简称RD)是NAND Flash存储器中可能遇到的一种问题,它指的是在读取存储单元时对存储的数据造成的意外改变(电荷不稳定、宇宙粒子射线等原因)。这种情况通常发生在多次读取操作之后,可能会影响数据的完整性和SSD的可靠性。核心优化 RD 的思路操作有两种:
-
ECC 校验修复。ECC 能够在读取时检测并修复常见的数据损坏。
-
数据迁移。通过 GC 等方式移到新的块中,降低同一部分物理地址块的重复读取。
New-Gen SSD
MLC, TLC, QLC
闪存分为SLC、MLC、TLC、QLC,这指的是一个存储单元存储 Cell 的位数。
-
SLC(Single-Level Cell)即单个存储单元存储1bit的数据。SLC速度快,寿命长(x万~10万次擦写寿命),但价格昂贵,是MLC的3倍以上。
-
MLC (Multi-Level Cell)即单个存储单元存储2bit的数据。MLC速度一般,寿命一般(约为3000~10000次擦写寿命),价格一般。
-
TLC (Trinary-Level Cell)即单个存储单元存储3bit的数据,也有闪存厂家称之为8LC。它速度慢,寿命短(1000~3000次擦写寿命),价格便宜。
-
QLC (Quad-Level Cell)即单个存储单元存储4bit的数据。擦写寿命为几百到 2000 次左右。
MLC、TLC、QLC 本质上是通过更精细地控制捕获电子的数量来使得单 Cell 能表达出更多的状态。擦写寿命值大家粗略做个量级参考,一方面技术在发展,测试数据会过时;另一方面各家的数据也不一样。
Usage
多层 LC 目前已被广泛使用,当前尤其是 MLC 和 TLC。个人市场基本很少 SLC,少数企业级还会用到。但是大部分企业级也是 MLC 和 TLC 了。个人市场可以参考电商网站如果某块盘同等 TB 级别的大容量下,比别的竞品明显便宜,去看详情介绍大概率是 QLC 的。
3D NAND
为了进一步提高容量、降低成本,NAND的制程工艺也在不断进步,从早期的50nm一路狂奔到目前的15/16nm,但NAND闪存跟处理器不一样,先进工艺虽然带来了更大的容量,但NAND闪存的制程工艺是双刃剑,容量提升、成本降低的同时可靠性及性能都在下降,因为工艺越先进,NAND的氧化层越薄,可靠性也越差,厂商就需要采取额外的手段来弥补,但这又会提高成本,以致于达到某个点之后制程工艺已经无法带来优势了。相比之下,3D NAND解决问题的思路就不一样了,为了提高NAND的容量、降低成本,厂商不需要费劲心思去提高制程工艺了,转而堆叠更多的层数就可以了,这样一来3D NAND闪存的容量、性能、可靠性都有了保证。
从具体设计和实现上来看,3D NAND也更多地采用电荷捕获型结构(charge trap)而不再单纯沿用浮栅设计,或将电流路径从单晶硅通道提升为多晶硅通道等,扩大了空间。不同厂商的堆叠方式也比较多样,涉及较多数字电路细节,本文不展开介绍 3D NAND 的原理。2024 H1 主流厂商已经发布堆叠 200+ 层的 3D NAND SSD,并在向 1000 层挑战。
3D XPoint (Intel Optane / Micron QuantX)
3D XPoint 是一种由英特尔和美光科技于2015年7月宣布的非易失性存储器(NVM)技术。英特尔为使用该技术的存储设备冠名Optane,而美光称为QuantX。它通常被认为是一种基于相变化存储器的技术,但也有其他可能性被提出。但是2021年3月美光出售相关工厂,2022年7月Intel也宣布放弃此技术(损失37亿元!英特尔为何要抛弃傲腾存储业务?-电子工程专辑 | “黑科技”的陨落,傲腾之死盖棺,英特尔都亏哭了!| Intel Optane 記憶體 200 系列將停產 - 滄者極限)。该种技术的材料和物理细节尚未公布。外部消息仅确认比特存储基于电阻的变化,并且内部也是可堆叠的。
英特尔® 傲腾™ 持久内存 (PMem) 和英特尔® 傲腾™ 固态盘都使用了相同的英特尔® 傲腾™ 内存介质,但它们是完全不同的产品。英特尔® 傲腾™ 持久内存位于 DIMM 封装中,在 DRAM 总线上运行,可以作为易失性内存或持久内存使用。而英特尔® 傲腾™ 固态盘严格用于标准 NAND 封装模型(AIC、M.2、U.2、EDSFF 等)中的快速存储,并采用 NVMe* 协议驻留于 PCIe 总线上,作为存储设备始终保持数据持久。
Intel Optane 主要分为两个产品线,PMem & SSD。
-
Persistent Memory (pmem):
-
Apache Pass(AEP): Intel’s codename for Intel® Optane™ DC Persistent Memory (DCPMM) (for Intel PMem 100 gen, PMem 200 系列叫 Barlow Pass)。ark.intel.com/content/www… ,可以理解为类似 Intel CPU 架构每一代也有 codename (xxx lake)。 后面通俗概念一般还是用 PMem 和 SSD 两种去区分。
-
Optane DIMM:dual in-line memory module 指接口协议,PMem 使用 DIMM 。另一种就是 SSD 通常走 NVMe 接口协议。DIMM 可以通过DRAM总线与CPU直接交互,并能够以两种模式运行:内存模式(Memory Mode)和应用直接模式(App Direct Mode)。在内存模式下,它作为易失性内存使用,扩展主内存容量;而在 App Direct 模式下,它提供数据持久性,应用程序可以直接与 PMem 交互,不需要 DRAM。
Usage Example
-
PolarDB / ByteNDB - log drive (using optane ssd)
-
TerarkKV
-
更多案例见官方:英特尔® 傲腾™ 持久内存
-
《New hope of PMem: after Intel's cancellation of Optane》 www.sigarch.org/persistent-…
Computational Storage Drive (CSD)
传统存储中,数据从存储设备复制到主机内存,由主机CPU处理完成之后,再经由主机内存复制回存储设备内。当数据量不断增长或数据的处理需求不断增长,当前设备无法满足计算需求时,有效的解决方案是扩展硬件(如采购更大的存储设备、更快的CPU、更多的服务器等)。但硬件扩展的速度往往跟不上数据增长的速度,而且更快的数据增长意味着存储设备中需要存放更多的数据,有更多的数据需要从存储设备私动到主机内存,CPU需要处理更多的数据。这时CPU算力、存储容量以及系统总线带宽都可能成为瓶颈,所以扩展硬件的方案在这种情况下就显得捉襟见时了。
可计算存储可拉近数据存储端(存储设备)与数据运算处理端(专有芯片,i.e. FPGA)的距离,盘内集成的专有芯片可直接在盘内完成数据的处理运算。如此一来,不但可大幅减少数据的搬移量,还可大幅提升计算的性能(专有芯片的计算性能远远高于通用芯片)。如果在一台服务器中插有多块可计算存储设备,甚至还可以利用多块可计算存储设备中的专有芯片来大幅提升计算的并行度。
以压缩或加解密场景举例,CPU 端计算会有以下缺点:
-
占用 CPU 资源
-
系统负载高的时候因抢占调度繁忙性能不稳定
-
主存和 CPU 之间的大量数据复制抢占其他计算的带宽(DRAM - L3 - L2 - L1 - Register)
Offloading 到 CSD 对应则有如下好处:
-
把压缩和加解密计算 offload 到专有芯片,CPU 可以释放出更多资源应对软件计算。
-
专有芯片计算本身不受系统 CPU 负载影响
-
专有芯片定制 MIMD 流水线实现,同时拥有流水线并行和数据并行的特点,且相比 CPU 其指令流水线比较稳定,性能更高。
-
零拷贝,比如解密或解压,CSD 直接在盘内读到数据计算,避免数据复制和整个流程的延时(IO + 解密解压)。这也是“近存储计算”的好处。
-
可跟随存储磁盘线性拓展,每多一块盘,都会带上专有芯片,不容易在相关场景形成 CPU Bound。
OpenChannel SSD
Open-Channel SSD 实现了把大部分传统 NVMe SSD FTL功能从 SSD Firmware 内部往上迁移(i.e. Host 端或自定义芯片),迁移的功能有Data Placement, Garbage Collection, L2P table , I/O Scheduling, Wear Leveling等。迁移到主机端的好处是主机对自己的写入模式更可控,FTL 不再会成为瓶颈,主机可以根据自己的业务情况去精细化设计 IO 隔离、垃圾回收时机等。另一方面,对于近存储计算需求来说,FTL 的开放有了更大的优化空间,比如可以直接读取 Physical Block Address(PBA,理解为闪存地址),计算后再转为 LBA(即用户视角的 SSD offset)。因此,OC SSD 是可计算 SSD 的一个典型的 SSD base。(参见 AliFlashV5、 ScaleFlux CSD 2000 等实现)
Usage Example
-
PolarDB Meets Computational Storage: www.usenix.org/conference/…
-
PolarDB X-Engine Compaction offload CSD www.usenix.org/system/file…
-
Baidu OpenChannel SSD as KV Service: maimai.cn/article/det…
Appendix
NVMe vs. SATA Comparison
| 特性/方面 | NVMe SSD | 普通SSD(SATA接口) |
|---|---|---|
| 接口类型 | PCIe接口,使用NVMe协议 | SATA接口 |
| 性能 | 提供更高的数据传输速率和更低的延迟 | 读写速度相对较低 |
| 延迟 | 具有更低的I/O延迟,数据传输迅速 | I/O延迟相对较高 |
| 并行性能 | 支持更多队列和命令,更好的并行处理能力 | 并行处理能力有限 |
| 功耗 | 功耗相对高一些,但性能好很多 | 功耗相对较低,性能也较低 |
| 尺寸和形状 | 通常采用M.2或U.2形式 | 通常采用2.5英寸硬盘形式 |
| 价格 | 通常价格更高,反映其高性能特性 | 价格相对较低,适合预算有限用户 |
| 兼容性 | 需要主板支持PCIe接口和NVMe协议 | 兼容性更广,几乎所有主板都支持 |
| 使用场景 | 高性能计算、高端游戏、专业工作站等 | 日常使用、办公应用 |
| 未来发展 | 作为新技术,预计将持续发展和普及 | 随着NVMe普及,可能会逐渐被取代 |
Bandwidth of NVMe SSD = Min(PCIe bandwidth, SSD bandwidth)
| PCIe 代 | 单向单通道参考最大带宽(GB/s) | SATA 代 | 带宽 (GB/s) |
|---|---|---|---|
| 1 | 0.25 | SATA 1.x | 0.15 |
| 2 | 0.5 | SATA 2.x | 0.3 |
| 3 | 1 | SATA 3.x | 0.6 |
| 4 | 2 | SATA Express | 1.9 |
| 5 | 4 |
举例:一个 PCIe 4.0 x4 的 NVMe SSD,读带宽理论最大值就是 2x4 = 8GB/s 。
NAND vs. NOR
必看“芯”知识:最全NAND flash与NOR flash详情解读_Flash
| 特性/方面 | NAND Flash | NOR Flash |
|---|---|---|
| 容量 | 容量较大,适合存储大量数据 | 容量相对较小,常见的有128KB、256KB、1MB、2MB |
| 读写速度 | 写入速度快,读取速度较NOR稍慢 | 读取速度比NAND稍快,写入速度较NAND慢很多 |
| 擦除速度 | 擦除速度远比NOR快(4ms vs 5s) | 擦除速度慢,执行一个写入/擦除操作的时间为5s |
| 擦除单元大小 | 擦除单元更小(8~32KB) | 擦除单元较大(64~128KB) |
| 应用领域 | 广泛应用于SSD等固态存储,军事、车载、工控、视频监控等 | 适合频繁随机读写,用于存储程序代码并直接在闪存内运行,如手机使用NOR Flas |
| 存储密度 | 提供极高的单元密度,达到高存储密度 | 无具体信息,但容量相对较小 |
| 耐用性/擦写次数 | 每个块的最大擦写次数是一百万次 | 擦写次数是十万次 |
| 直接执行 | 不支持XIP(eXecute In Place) | 支持XIP,应用程序可以直接在Flash闪存内运行 |
| 成本 | 生产过程简单,数据读写速度快,容量大,成本相对较低 | 成本相对高,容量偏小 |
| 接口方式 | 使用复杂的I/O口来串行地存取数据 | 带有SRAM接口,有足够的地址引脚来寻址,可以直接和CPU相连 |
| 写入操作前需求 | 需要先进行擦除操作 | 需要先将目标块内所有的位都写为0后再进行擦除 |
| 芯片共性 | 写数据必须先将对应内容清空,即先擦后写;擦写次数有限 | 同上 |
| 寿命 | 可擦写次数高于NOR Flash,但因为擦写过程复杂,失败概率相对较高。最后均摊下来不一定有优势。 | 寿命较长,写入和擦除速度低,但写操作失败概率低 |