关于SSD元数据及掉电保护的误解

 

此文是对ssdfans群聊的一个小总结,也解决了冬瓜哥的一些困惑,所以感觉非常有必要做个总结。...



此文是对ssdfans群聊的一个小总结,也解决了冬瓜哥的一些困惑,所以感觉非常有必要做个总结,让大家更深一步了解SSD在元数据管理层面上的运作机制。在此感谢ssdfasn群提供了一个相互交流闪存技术的平台,感谢群友们的知无不言,言无不尽。

关于元数据
page里有元数据,内存里同步维护一张按逻辑页号排序的大表。

SSD需要记录很多元数据,典型的就是逻辑页号与物理页号的映射关系。逻辑页号对应的物理页是在不断变化当中的,至于控制器将某个页面重定向写入到哪个物理页,就是FTL模块综合计算的结果了。

一般认为,这种映射关系无非就是一张大表,保存在SSD控制板上的SDRAM中,大概会有Flash裸容量的千分之一大小。如果裸容量4TB,那么这张表就大概有4GB这么大。

由于每一笔IO,主控都需要查表来寻址物理页号,该表以逻辑页号排序,可以做到一次定位。但是SSD板载DRAM容量太小,所以总有大部分表是放在Flash里某固定位置上的,比如可以放到SLC介质区,以保证查表时的性能。

对于写IO,逻辑页对应的物理页会变化。主控要将这个变化记录下来。一般理解,对应物理页号如果此时恰好在DRAM中,那么主控直接改DRAM即可,假设DRAM中如果有500MB的物理页号变更导致的脏数据,此时一旦系统掉电,主控需要将这500MB的脏数据刷盘,而一般SSD采用的电容量不足以支撑这么多数据的写入。

实际上,主控是这么干的:将对应页面的逻辑页号存储到该page中的固定位置,随着page的有效数据一起写入。目前page有效容量在8K/16K粒度,一个Page的物理容量其实是有效容量+校验+元数据(逻辑页号等)。每个页面都保存有自己所属的逻辑页号。同时,主控在DRAM中还维护了那张按照逻辑页号排序的大表。这样,就算掉电,DRAM里数据全部丢失,那么主控也还可以读出所有page,根据其中保存的逻辑页号,将这张大表重新构建起来。这就是为什么有些早期的SSD在系统突然掉电之后,必须等待较长的时间才可用的原因。

Block里也有元数据。

比如,用于记录该Block的高水位线,也就是最后一个被Program的page的偏移量。

如果能够记录每个LBA所在的页内偏移量,小块写写性能将非常好。

由于NAND Flash的IO单位是一个Page,如果前端接收到的写IO size小于一个Page,比如,IO size=0.5K,这是SCSI/ATA时代的遗留标准(最小IO单位是一个扇区),那么主控也要读出一个page,盖掉其中的对应的0.5K, 然后后台再将该page写下去。如果有大量的随机0.5K的写IO,那么主控则无法将其合并到一个page中一次性写入,因为一个page内所保存的LBA在局部必须是连续的,因为主控只维护逻辑页号和物理页号的对应,并没有维护逻辑页内部LBA的位置,这样可以节省大量的元数据,代价就是写惩罚。

如果想做到对大范围全随机的小块写IO进行拼接然后写入一个page,那就得记录LBA粒度的映射,这样表会很大,page里也要保存对应数量的LBA地址,假设每个LBA48bit的话,16K的page就得保存32 x 48bit的元数据量。

其他相关阅读:

【冬瓜哥画PPT】浅谈闪存控制器架构

【冬瓜哥论文】浅析固态介质在存储系统中的应用方式

你绝对想不到的两种高逼格存储器

【冬瓜哥手绘】大话众核心处理器体系结构


    关注 大话存储


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册