SSD-OCSSD-ZNS
传统SSD,OCSSD,ZNS SSD
SSD有与HDD机械硬盘完全不同的性质。机械硬盘是可以覆盖写的,但SSD在写入数据前必须先擦除。SSD在闪存单元存取数据中有page和block的概念。SSD被划分成多个大小固定block,一个block被划分成了很多page。block是最小擦除单位,写操作只能写到空page中。由于SSD使用的是闪存颗粒,有一定的擦除次数限制。因此,为了能提高SSD的使用寿命,还需要在其中加入均衡磨损的策略。
为了保证上层设备无需任何修改,就能从机械硬盘换成SSD,传统SSD需要做到和机械硬盘一样能够原地修改数据,SSD中的FTL模块正是去实现这个目的的。在FTL模块中,有DRAM来保存逻辑块地址到物理块地址的映射关系,同时还需要添加垃圾回收策略以减少大量的失效数据。由于上层的数据放置习惯和SSD本身的性质并不匹配,这样的设计使传统SSD并不能完全利用自身的所有资源,导致了over-provisioning问题,较大的WAF和尾部延迟。
Open Channel SSD的设计是在传统SSD上的改进。相较于之前SSD与主机的相对隔离,它允许主机与SSD通过一组连续的LBA块进行协作。它将原本FTL负责的任务转交由主机完成,消除了SSD设备的垃圾回收开销,也意味着降低了over-provisioning和DRAM的成本,相应地,还能提升部分的读写性能。但将所有的数据管理交由主机负责,说明主机还需要管理不同SSD实现的差异,后续为了适配不同版本SSD,维护OCSSD软件接口的难度很大。
ZNS在OCSSD的设计思想做了些修改,它避免主机直接管理SSD的特性,而是提供了一套相对独立的存储接口,不需要针对SSD的不同性质定制不同的数据管理策略,维护的难度的工作量也不那么高。ZNS的设计将软件的部分交由主机完成,硬件的部分由SSD完成。即主机去决策数据的放置,SSD去处理均衡磨损的问题。
ZNS接口的优势和问题
ZNS的设计使设备有更多机会去提升读写性能,更有可能使用高效的放置数据算法降低WAF。由于不需要FTL模块,减少了DRAM的相关成本和over-provisioning问题。但主机需要处理的任务变多了,需要去管理zone的开、关、重置和垃圾回收,同时必须限制写操作是线性的。在主机需要管理的这些方面,都有一定的提升空间。例如,有ZNS SSD优化的垃圾回收策略,有针对RocksDB数据文件放置的策略优化的等等,能够看到后续有很多论文都是针对ZNS的部分细节进行优化。除此以外,我认为ZNS比较大的问题是应用的场景较为单一:只有在线性写的场景下才能使用ZNS。然而目前大部分的应用还是偏向于HDD的原地修改的存储模式,如果想要大范围应用也许需要在主机的软件架构层面进行很多的修改。
ZNS的应用
有关ZNS的研究仍在持续推进,目前已有很多开源应用支持ZNS。比如ZenFS作为RocksDB的插件,比如存储引擎MyRocks能够支持运行Percona MySQL,它们的表现相较于使用传统的SSD都有很好的性能提升。还有正在进行开发的项目,如字节跳动的开源项目TerarkDB,该项目的其中一个分支也正在基于ZenFS持续进行优化,目前已经可以使用ZNS SSD进行性能方面的测试。
同时,对于一些使用线性写形式的文件系统,如f2fs、btrfs、zfs,已经能够支持zone了。尽管不是所有的写操作都是线性的,但可以通过严格的log-structured写,一个超级块来弥补该问题。
ZNS的最新发展趋势
ZNS SSD是大势所趋,但目前可以预想到的主要应用场景还是聚焦在可以高度定制、更新换代较快的数据中心硬盘。在未来经过不断讨论、修改和测试之后,云计算厂商会开始大范围部署这项服务。经过长时间的使用和数据分析的积累,也许能以此为契机ZNS的设计能够得到进一步优化。
ZNS的发起者Matias还说,“ZNS目前还获得手机厂商的兴趣,新的闪存盘可能会让平板和智能手机的电池续航更久、单元存储的价格更低。”在未来,等待ZNS技术日趋成熟之后,也许手机平板也有很好的方案去适配ZNS,让更多的个体用户体验到ZNS。