深入浅出 SSD
请阅读完成下面的内容,然后再去看别的东西
- https://codecapsule.com/2014/02/12/coding-for-ssds-part-1-introduction-and-table-of-contents/
https://github.com/spdk/spdk : 配合 dpdk 了解一下,还可以分析一下 build your own x 的 tcp stack 的构建过程
https://link.springer.com/chapter/10.1007/978-94-017-7512-0_10
Introduction
·FTL 闪存转换层:作为 SSD 固件的核心部分,FTL 实现了例如映射管理、磨损均衡、垃圾回收、坏块管理等诸多功能,本书将一一介绍。 ·NAND Flash:NAND Flash 作为 SSD 的存储介质,具有很多与传统磁介质不同的特性,本书将从器件原理、实战指南、闪存特性及数据完整性等方面展开。 ·NVMe 存储协议:作为专门为 SSD 开发的软件存储协议,NVMe 正在迅速占领 SSD 市场。本书将从其优势、基础架构、寻址方式、数据安全等方面展开。为了让读者对 NVMe 命令处理有更加直观的认识,本书结合实际的 PCIe trace 进行阐述。同时,本书也介绍了 NVMe Over Fabric 的相关知识,让读者能够对未 [……] ·PCIe 协议:PCIe 作为目前主流的 SSD 前端总线,与之前的 SATA 接口相比有着极大的性能优势。本书将从 PCIe 总线拓扑结构、分层结构、TLP 类型与路由、配置和地址空间等方面进行介绍。 ·电源管理:本书详述了 SSD 前端总线(包括 SATA 和 PCIe)的各种节能模式、NVMe 协议的电源管理方案及在 SSD 里常用的整体电源管理架构——Power Domain。 ·ECC:本书介绍了 ECC 的基本概念,重点介绍了 LDPC 的解码和编码原理,以及在 NAND 上的应用。
SSD 是用固态电子存储芯片阵列制成的硬盘,主要部件为控制器和存储芯片,内部构造十分简单。详细来看,SSD 硬件包括几大组成部分:主控、闪存、缓存芯片 DRAM(可选,有些 SSD 上可能只有 SRAM,并没有配置 DRAM)、PCB(电源芯片、电阻、电容等)、接口(SATA、SAS、PCIe 等),其主体就是一块 PCB,如图 1-3 所示。软件角度,SSD 内部运行固件(Firmware,FW)负责调度数据从接口端到介质端的读写,还包括嵌入核心的闪存介质寿命和可靠性管理调度算法,以及其他一些 SSD 内部算法。SSD 控制器、闪存和固件是 SSD 的三大技术核心
SSD 通过诸如 SATA、SAS 和 PCIe 等接口与主机相连,实现对应的 ATA、SCSI 和 NVMe 等协议
补充一下表格 1-5
主要有以下几种原因导致:
- 擦写磨损(P/E Cycle)。
- 读取干扰(Read Disturb)。
- 编程干扰(Program Disturb)。
-
数据保持(Data Retention)发生错误。
- UBER:Uncorrectable Bit Error Rate,不可修复的错误比特率。
- RBER:Raw Bit Error Rate,原始错误比特率。
- MTBF:Mean Time Between Failure,平均故障间隔时间。
SSD 上电加载后,主机 BIOS 开始自检,主机中的 BIOS 作为第一层软件和 SSD 进行交互:第一步,和 SSD 发生链接,SATA 和 PCIe 走不同的底层链路链接,协商(negotiate)到正确的速度上(当然,不同接口也会有上下兼容的问题),自此主机端和 SSD 连接成功;第一步,发出识别盘的命令(如 SATA Identify)来读取盘的基本信息,基本信息包括产品 part number、FW 版本号、产品版本号等,BIOS 会验证信息的格式和数据的正确性,然后 BIOS 会走到第三步去读取盘其他信息,如 SMART,直到 BIOS 找到硬盘上的主引导记录 MBR,加载 MBR;第四步,MBR 开始读取硬盘分区表 DPT,找到活 动分区中的分区引导记录 PBR,并且把控制权交给 PBR……最后,SSD 通过数据读写功能来完成最后的 OS 加载。完成以上所有这些步骤就标志着 BIOS 和 OS 在 SSD 上电加载成功。任何一步发生错误,都会导致 SSD 交互失败,进而导致系统启动失败,弹出 Error window 或蓝屏。
主控
主控是 SSD 的大脑,承担着指挥、运算和协调的作用,具体表现在:一是实现标准主机接口与主机通信;二是实现与闪存的通信;三是运行 SSD 内部 FTL 算法。
Flash
一个 Block 当中的所有这些存储单元都是共用一个衬底的。
一个 Wordline 对应着一个或若干个 Page,具体是多少取决于是 SLC、MLC 或者 TLC。对 SLC 来说,一个 Wordline 对应一个 Page;MLC 则对应 2 个 Page,这两个 Page 是一对(Lower Page 和 Upper Page);
- 闪存坏块
- 要注意的是,读干扰影响的是同一个闪存块中的其他闪存页,而非读取的闪存页本身。
- 写干扰影响的不仅是同一个闪存块当中的其他闪存页,自身闪存页也会受到影响。相同的是,都会因不期望的轻微写导致比特翻转,都会产生非永久性损伤,经擦除后,闪存块还能再次使用
- 存储单元间的耦合
- 电荷泄露
MLC 可以包含两个 bit 的信息,对应 lower page 和 uppper page
读干扰会导致浮栅极进入电子。由于有额外的电子进入,会导致晶体管阈值电压右移(Data Retention 问题导致阈值电压左移)
PCIe
PCI 使用并口传输数据,而 PCIe 使用的是串口传输
PCI 采用的是总线型拓扑结构,一条 PCI 总线上挂着若干个 PCI 终端设备或者 PCI 桥设备,大家共享该条 PCI 总线,哪个人想说话,必须获得总线使用权,然后才能发言
图 5.6 和 5.7 很有,补充一下
Root Complex(RC)是树的根,它为 CPU 代言,与整个计算机系统其他部分通信,比如 CPU 通过它访问内存,通过它访问 PCIe 系统中的设备。 RC 的内部实现很复杂,PCIe Spec 也没有规定 RC 该做什么,不该做什么。我们也不需要知道那么多,只需清楚:它一般实现了一条内部 PCIe 总线(BUS 0),以及通过若干个 PCIe bridge,扩展出一些 PCIe Port,如图 5-8 所示。
PCIe 定义了下三层:事务层(Transaction Layer)、数据链路层(Data Link Layer)和物理层(Physical Layer,包括逻辑子模块和电气子模块)
事务层的主要职责是创建(发送)或者解析(接收)TLP(Transaction Layer Packet)、流量控制、QoS、事务排序等。 数据链路层的主要职责是创建(发送)或者解析(接收)DLLP(Data Link Layer Packet)、Ack/Nak 协议(链路层检错和纠错)、流控、电源管理等。 物理层的主要职责是处理所有的 Packet 数据物理传输,发送端数据分发到各个 Lane 传输(Stripe),接收端把各个 Lane 上的数据汇总起来(De-stripe),每个 Lane 上加扰(Scramble,目的是让 0 和 1 分布均匀,去除信道的电磁干扰 EMI)和去扰(De-scramble),以及 8/10 或者 128/130 编码解码等。
Switch 的主要功能是转发数据,为什么还需要实现事务层?Switch 必须实现这三层,因为数据的目的地信息是在 TLP 中的, 如果不实现这一层,就无法知道目的地址,也就无法实现数据寻址路由。
根据软件层的不同请求,事务层产生四种不同的 TLP 请求:
- Memory;
- IO;
- Configuration;
- Message : 中断 错误 电源管理
每个 PCIe 设备都有这样一段空间,主机软件可以通过读取它获得该设备的一些信息,也可以通过它来配置该设备,这段空间就称为 PCIe 的配置空间。 整个配置空间就是一系列寄存器的集合,由两部分组成:64B 的 Header 和 192B 的 Capability 数据结构。
具体实现就是上电的时候,系统把 PCIe 设备开放的空间(系统软件可见)映射到内存地址空间,CPU 要访问该 PCIe 设备空间,只需访问对应的内存地址空间。RC 检查该内存地址,如果发现该内存空间地址是某个 PCIe 设备空间的映射,就会触发其产生 TLP,去访问对应的 PCIe 设备,读取或者写入 PCIe 设备。
FTL
- 每个闪存块读的次数是有限的,读得太多了,上面的数据便会出错,造成读干扰(Read Disturb)问题。
- 闪存的数据保持(Data Retention)。
- 对 MLC 或 TLC 来说,存在 Lower Page corruption 的问题 : 即在对 Upper Page/ExtraPage(和 Lower Page 共享存储单元的闪存页)写入时,如果发生异常掉电,也会把之前 Lower Page 上成功写入的数据破坏掉。好的 FTL,应该有机制尽可能避免这个问题;
- MLC 或 TLC 的读写速度都不如 SLC,但它们都可以配成 SLC 模式来使用。
根据映射粒度的不同,FTL 映射有基于块的映射,有基于页的映射,还有混合映射(Hybrid Mapping)。
FTL 都是基于页映射的,因为现在 SSD 基本都是采用这种映射方式。
对于绝大多数 SSD,我们可以看到上面都有板载 DRAM,其主要作用就是存储这张映射表
映射表在 SSD 掉电前,是需要把它写入到闪存中去的。下次上电初始化时,需要把它从闪存中部分或全部加载到 SSD 的缓存(DRAM 或者 SRAM)中。随着 SSD 的写入,缓存中的映射表不断增加新的映射关系,为防止异常掉电导致这些新的映射关系丢失,SSD 的固件不仅仅只在正常掉电前把这些映射关系刷新到闪存中去,而是在 SSD 运行过程中,按照一定策略把映射表写进闪存。这样,即使发生异常掉电,丢失的也只是一小部分映射关系,上电时可以较快地重建这些映射关系
如果用户顺序写的话,垃圾比较集中,利于 SSD 做垃圾回收;如果用户是随机写的话,垃圾产生比较分散,SSD 做垃圾回收相对来说就更慢
Trim 对于写放大影响很大.
文件系统的删除,将特定的区域标记为 free,当文件系统这些地方分配出去,重新写的时候, 那么,这些地方被标记为无效, 如果对于 free 的写,不是连续,那么其实是 free 的空间就会被 搬运一遍。
f2fs 的连续写可以防范 ssd 的碎片化
FTL 映射表记录每个 LBA 对应的物理页位置。Valid Page Bit Map(VPBM)记录每个物理块上哪个页有有效数据,Valid Page Count(VPC)则记录每个物理块上的有效页个数。通常 GC 会使用 VPC 进行排序来回收最少有效页的闪存块;VPBM 则是为了在 GC 时只读有用的数据,也有部分 FTL 会省略这个表。
动态磨损平衡算法的基本思想是把热数据写到年轻的块上,即在拿一个新的闪存块用来写的时候,挑选擦写次数小的;静态磨损平衡算法基本思想是把冷数据写到年老的块上,即把冷数据搬到擦写次数比较多的闪存块上。
问题
- erase 和 write 的 granularity 的为什么是 block 和 page
- 为什么划分为 block 和 page 的级别 ?
- nvme 和 PCIe 的关系是相互替代 ?
- 所在的层次是什么 ?
- 能不能对其编程
- github 上 nvme 的工具的实现说明这些 SSD 都是存在相同的接口的,那么能不能写一个程序,类似的
瞎几把操作 ssd
- 系统中间的
- FTL 的映射表:
- FTL 的映射表放在那里啊! 如果也是使用 nand 进行存储,那么,
- SSD 的缓存
- 冷热数据的区分为什么可以更好的处理 flash 特性
-
nand : 写的粒度和 erase 的粒度 ?
-
操作写放到的因素是什么 ?
- M.2 的关系是什么 ?
-
PCIe 和 USB 的关系 ?
- PCIe 的 RC 可以自动将读写设备的空间转化为 设备的访问,那么 IOMMU 做啥的 ?
- PCIe 的空间相互冲突,怎么办 ? 那些驱动似乎是将 PCIe 映射的空间在软件重点写死的
- PCIe 是如何和 DMA 相互交互的, 存在 PCIe 控制器这种东西吗 ? 那么 DMA 控制器放在那里了 ?
看看
https://pages.cs.wisc.edu/~remzi/OSTEP/file-ssd.pdf
https://news.ycombinator.com/item?id=39908146
有趣的
https://mp.weixin.qq.com/s/_1Ih5C-r07-DM2T-5ntXSw
看看这些产品吧,还是很有趣的
https://semiconductor.samsung.com/cn/ssd/datacenter-ssd/pm9a3/mzql21t9hcjr-00a07/
nvmecli 的简单使用
https://metebalci.com/blog/a-quick-tour-of-nvm-express-nvme/
这里的测试方法,测试工具学习一下
https://mp.weixin.qq.com/s/MGazZjYVcUuuqbL7pOlpew
本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。