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完成
更一般地,可以简化为这样的模型: