了解硬件特性有助于我们针对特性进行进一步的探索与优化。
为了使闪存成为存储数据的友好介质,我们需要一种机制:
将更新的信息写入新的空页,然后将 所有后续读取请求转移到其新地址
确保新编程的页面均匀分布在所有可用闪存中,以便均匀磨损
保留所有旧的无效 页面的列表,以便在以后的某个时候可以将它们全部 回收以备重用
这种机制称为 闪存转换层(FTL),如果您仔细观察,您会在所有闪存介质上找到它。
FTL 在设备端还是Host 端?
FTL所在的位置在哪?
SSD有Host Based FTL和Device Based FTL两种模式。
Device Based FTL 在设备端
绝大多数的FTL 都是在设备端。
具体来说是在主控芯片中,
再具体说是在主控芯片固件中,
再具体说是在主控芯片固件中端。
Host Based FTL 在主机端
把FTL放在主机驱动程序中,Device Based则是把FTL放在SSD主控内部。【1】
Host Based SSD一般的模式是把闪存的读写接口直接开放给驱动程序,这样驱动程序就能自行管理闪存内部资源。控制器大都采用可编程逻辑器件FPGA,功能比较简单,主要实现ECC纠错和闪存时序控制。前几年提出的Open Channel SSD 便是这个思路。 但是这个阻碍是很大的, 一方面Host 要开发新的架构来管理FTL, 大厂才有这种实力,小厂是没有人力去做这个的,最后也只有阿里搞出了Open Channel SSD, 阿里云使用。另一方面设备厂商也不太愿意推动这个, 费力还不讨好, 设备商的活少了, 生意不也就少了嘛。
FTL 的职责
很多人知道FTL 负责映射表, 但其实远不止如此。FTL 有许多职责,现在让我们来看看它们。
Address Translation——映射管理
地址映射,也可以叫做mapping,负责逻辑地址和物理地址之间的映射,多技术模块都以该机制为核心进行。在闪存系统中,当页面被认为无效时,逻辑块地址可以重新映射到新编程的页面。这以一种对任何发出 I/O 请求的人来说既简单又透明的方式为我们上面列表中的第 1 位提供了解决方案。
why? 众所周知,Nand Flash具有写时擦除的特性,因此写入数据时不得不异地更新。需要维护一张逻辑地址到物理地址的映射表。
Garbage Collection——垃圾回收
垃圾回收,简称GC,回收异地更新产生的脏数据所占空间的回收工作。
Why? 因为闪存异地更新, 会存在很多block 里只有很少的有效数据, 无效数据不能释放出来, FTL需要做垃圾回收。
需要付出很多努力才能回收少量无效页面 - 就像磨损均衡一样,在GC后台移动数据的行为会对性能和耐久性产生影响。这又是一个找到正确平衡的问题
Trim
Trim是一种用来增加GC垃圾回收效率的算法。
没有Trim的话,会出现这样一种情况:在操作系统删除一个文件,实际上数据在物理层面上并没有被删除。
Wear Leveling——磨损平衡
缩短不同块之间的擦写次数差别,均衡闪存块的寿命;分为动态磨损平衡和静态磨损平衡;
如果系统中的所有块都定期更新,这就没有问题,因为当页面被标记为无效然后被回收时,磨损均衡几乎会自然发生。但这就是问题所在:如果我们有一些冷块,即数据永远不会改变的位置,那么我们必须采取措施手动重新定位该数据,否则这些块将永远不会磨损……这意味着我们实际上是在 增加写入工作量系统,这最终意味着增加磨损。
因此,简而言之,我们对均匀磨损均衡的要求越高,我们造成的磨损就越多。但不够积极可能会导致热点和冷点,因为磨损变得更加不均匀。一如既往,这是一个找到正确平衡的问题。或者,如果您愿意,找到写入平衡。【3】
Power off Recovery —— 掉电恢复
掉电恢复,简称POR。正常掉电,SSD会把缓存中的数据刷新到闪存,重新加载保存的数据即可。如果是异常掉电,因为某些人为或自然外力的原因导致数据没有成功写入到Nand中,掉电恢复要恢复到掉电前的安全状态,比如恢复RAM中的数据和Address Translation中的映射表。
Error Handler——坏块管理
处理读写操作中遇到的Fatal Error或读操作过程中ECC Error状况,以及Bad Block或Weak Block的管理。略过坏块或者跳过坏块, 并记录哪些是坏块, 避免下次再用到;
SLC cache
SLC cache是把MLC或者TLC的一部分闪存块,配置为更优速度优势的SLC模式来作为Cache使用,让SSD具有更好的突发性能。不过一般主要用于消费级SSD或者移动存储中,主要原因是SLC Cache具有更好的突然性能。但是企业级SSD更追求稳定的速度, 一般不使用 SLC Cache;
RD & DR
RD指的是Read Disturb,DR指的是Data Retention。两者都能导致数据丢失,但原理和固件处理方式都不一样;
RD——对一个闪存块来说,每次读其中的一个闪存页,都需要在其他字线(Wordline)上加较高的电压以保证晶体管导通。这个操作有点类似于轻量的写操作;长期会导致比特翻转;因此需要在达到读阈值之前对这个闪存块上的数据进行刷新;
DR——电子从浮栅极跑出,导致比特翻转;由FTL定期扫描,翻转超出阈值进行数据刷新,避免数据丢失;
Over Privision——预留空间
NAND出厂考虑到后面预留可能坏块, 会多准备一些物理块, FTL需要利用这些物理块做GC和存储元数据(如映射表)
Latecncy 平滑管理
均衡控制前端主机写入速度和GC 速度, 避免速度波动。
WAF写入放大
您可能只会看到主机知道的前台 I/O 操作,看不到 后台正在发生的事情,如磨损均衡 和 GC 对闪存的写入。 闪存的性能和耐用性取决于前台和后台操作的总和
写放大越大,意味着额外写人闪存的数据越多,一方面磨损闪存,减少SSD寿命,另一方面,写人这些额外数据会占用底层闪存带宽,影响SSD性能。【2】
细心心的朋友会发现,这些功能和主控功能相似,和固件功能相似。没错。
固件的核心功能就是通过 中端FTL 来实现的。
固件前端负责和Host 交互, 遵循 NVME/ SATA/USB 协议。
固件后端负责和非易失性存储器(主要是 NAND Flash)交互, 遵循NVM 协议, 如 Toogle/ ONFI。
以后再展开介绍这些功能模块。
总结
在主控芯片固件中端, 很多人知道FTL 负责映射表, 但其实远不止如此。FTL 有许多职责。
参考
【1】https://blog.csdn.net/Gloria_y/article/details/120495807
【2】https://blog.csdn.net/weixin_44330425/article/details/107220948
【3】 https://flashdba.com/2014/09/17/understanding-flash-the-flash-translation-layer/