SSD已经在生产、生活环境中应用很多年了,但是文件系统对于SSD数据的管理逻辑还是按照HDD的那一套,称为block interface,SSD要融入软件栈,则需要模仿HDD的行为,这个模仿的动作由FTL来完成。
FTL分为Host Based和Devices Based,分别表示FTL是在主机端实现还是SSD控制器端实现。目前主流都是Device Based FTL。
闪存Page为SSD的最小读取和写入单元,对应HDD的Sector,一般为4KB~16KB,固件可以调整。FTL的主要工作就是负责将逻辑地址映射到SSD的Page上去。也就是从逻辑地址到物理地址的映射。
FTL的存在导致我们为了降低读时延,需要将FTL放入更快的缓存中。一般这个缓存是SSD盘上的DRAM或SLC(ramless)。缓存和SSD容量的比例为1:1000,也就是1TB的SSD需要1GB的DRAM做缓存,这就造成了额外的成本。
另外在随机读写I/O下,SSD的Block很快变得有效数据和无效数据混杂,这个时候GC就会介入,将有效数据迁移到一个空的Block中,然后将原Block擦除,这种行为会导致读写带宽和尾时延受到很大影响,也会导致SSD寿命的降低。
为了让GC的影响变小,SSD会根据业务场景预留不同的容量空间(Over Provision)作为数据搬移的中转Block,这无疑也大大增加了用户的CAPEX。
为了解决这些问题,NVMe 2.0协议中加入了ZNS的命令集。
ZNS会彻底去除GC的数据搬移写放大,会降低DRAM的使用量到1/8,OP(Over Provision)使用量到1/10甚至完全不需要OP,这让企业存储用户对于这项技术十分感兴趣。
可以看到在数据中心高负载写业务的场景下(OP 156%),开启ZNS可以让成本下降一半以上。
在此基础上,还可以保证数据写入的Throughput不会随着SSD的数据量逐渐增多而产生明显的降低。
以上所有的好处都是需要付出一定的代价的,主要的问题在于对应用的I/O行为模式有了新的要求,具体情况在后续章节中说明。