SSD 基础知识

1. 地址映射

1.1 页级映射

1.2 块级映射

注意需要保证页在块内的偏移位置不变

1.3 混合映射

这种情况下,对一小部分数据进行页级映射,更新的算法为:

读取:首先在日志块中查找目标页,否则读取数据块

写入:直接写入到数据块中

更新:将更新写入到日志块,将数据块中的部分置为无效

实质上,混合映射就是用顺序写吸收了更新请求。数据块需要块映射,每次更新请求都要保证块内索引一致,这样维护开销太大,所以分出来一批使用页映射,最后再把许多日志块内页映射的部分合并一起放回数据块。

合并也分为三种情况:

切换合并

条件:顺序更新 且 整块

开销:与直接块级映射相同,只需做一次擦除

部分合并

条件:顺序更新 且 非整块

开销:一次擦除 + 一次额外复制

完全合并

条件:随机写入

开销:具体计算

2. 垃圾回收(GC, Garbage Collection)

基本过程

选 -> 移 -> 擦

目标块选择

  • 贪心:无效页最多的块优先

  • 磨损均衡:考虑擦除次数

  • 数据冷热:考虑最近更新时间

3. 磨损均衡

磨损均衡的分类

  • 动态均衡:分配空闲块时写入擦除次数最少的块

  • 静态均衡:当块的最大和最小擦除次数差别超过某个阈值时,将擦除次数最小的块中的有效数据迁移到擦除次数最大的空闲块中,使得分配空闲块时写入擦除次数相对较少的块

磨损均衡的优化

  • 冷热数据分离

  • 损耗程度评估

4. NVMe 协议

NVMe 协议很复杂,涉及到很多数据结构,我们在这里只关心其中三个:

  • 提交队列(SQ, Submission Queue)

  • 完成队列(CQ, Completion Queue)

  • 门铃寄存器(DB, Doorbell Register)

SQ 和 CQ 位于主机端内存,DB 位于 SSD控制器 中,下面的图展示了一次基本的工作流程:

即:

1. 主机写SQ,表示请求I/O

2. 主机触发DB,告知SSD自己做了第 1 步

3. SSD取SQ,执行,写CQ

4. SSD触发MSI-X中断,告知主机自己做了第 3 步

5. 主机取CQ,检查,触发DB告知SSD完成

更一般地,可以简化为这样的模型: