Zoned Namespace_NVMe Spec对标Open-Channel的解决方案(下篇)

作者简介:刘孝冬,资深工程师 ,主要从事SPDK以及ISA-L软件开发工作

文章转载自DPDK与SPDK开源社区

背景

目前在业界广泛使用的NVMe 协议,它的Spec1.3已经推出近两年了。Zoned Namespace作为一个新的特性会逐步被NVMe工作组接纳,并在未来的NVMe Spec 版本中支持。

Zoned Namespace中的zone名称,源自于为SMR硬盘(Shingled Magnetic Recording, 叠瓦式磁记录)所做的设计。相关标准化组织曾制定了ZBC(Zoned Block Commands,分区块命令集)与ZAC(Zoned-device ATA Commands, 区设备ATA指令集),来对SCSI和ATA协议进行拓展。所以zone所涉及的状态转换与软件栈,都与之前的SMR硬盘相符。

Zone状态转换

zone可能处于一下几种状态,它们的转换关系如图1所示:

  • Emptyzone内无有效数据
  • Explicitly Openedzone被Management命令显式的打开
  • Implicitly Openedzone处在打开状态,但并非是由Management命令打开的
  • Closedzone被Management命令显式的关闭
  • Fullzone处于写满状态
  • Offlinezone无法被读写

图1 Zone State Transition

一个zone只有在Open状态下才可以写入数据;擦除可以使写满的zone回退到Empty状态;在zone的内部Nand介质达到磨损极限后处于Offline状态。它的正常工作状态变化过程为:
Empty → Open → Full → Empty

ZM(Zone Management,zone管理)command 有ZM Open, ZM Close, ZM Reset, ZM Finish等,可以控制zone的状态变化。例如,在正常工作过程中,zone的状态变化需要ZM命令的参与:
Empty → → Explicitly Opened → / → Full → → Empty

Zone 在Linux kernel里的软件生态

业界也早已为SMR硬盘的推广,添加了很多软件生态。如图2所示, 例如在Linux体系中, 有用户态函数库libzbc;文件系统中加入针对SMR的优化;SCSI/ATA驱动增加对SMR相关指令集的支持。

Linux内核中块设备有对zone支持的zoned block device模型,通用设备映射器(Device Mapper)中加入的dm-zoned device mapper, 可以将一个zoned block device映射为不受追加写限制的通用块设备。开启此类映射需要用到两个工具命令,一个是Device Mapper的工具dmsetup,另一个是zoned block device 专用工具dmzadm (dm-zoned admin).

图2 Zone software stack in LinuxKernel

假设主机上插有一个SATA SMR硬盘,它在linux 内核中是一个zoned block device, 设备抽象文件位置在/dev/sdb,期望将它作为标准块设备使用。则这个映射过程,需要先用dmzadm格式化zoned block device:

这个格式化过程包括获取设备zone的配置信息,决定元数据集在zoned block device上的存放位置,并初始化相关元数据。之后,就可以用dmsetup命令在此zoned block device上创建出一个通用块设备:

命令执行完毕后,相应的通用块设备会出现为/dev/mapper/dmz-sdb。如果一个NVMe SSD的一个Namespace是Zoned Namespace, 若主机仅仅期望像通用块设备一样来使用它,则整个命令过程同SATA SMR盘一样,仅仅是将参数/dev/sdb改为/dev/nvmeXnY.

文件系统诸如F2FS、BTRFS中已经有了对zoned block device的直接支持,所以它们可以直接操作zoned block device,绕过DM-zoned。如果一个NVMe SSD的一个Namespace是Zoned Namespace时,F2FS和BTRFS可以直接配置使用它,而无需额外的开发工作。

Zoned Namespace尽可能的去贴近SMR引出的zone定义,在通用应用和定制化应用上,都能够重用SMR已经建立好的软件生态,利于推广。

SPDK对Zoned Namespace的支持

SPDK未来对Zoned Namespace的支持,主要涉及Bdev Layer和FTL两个方面:

SPDK Bdev Layer的扩充
为了增加对Zoned Namespace的适配,SPDK未来会在Bdev接口层修改或加入多个针对Zoned Namespace的API, 例如:

  • Spdk_bdev_get_zonedev_info
  • Spdk_bdev_get_zone_info
  • Spdk_bdev_zone_open/close/finish
  • Spdk_bdev_zone_append
  • 优化Spdk_bdev_open,加入AER事件回调函数,增强对NVMe AER的支持。类似于Open-Channel,Zoned Namespace同样需要通过AER来让上层软件得知一些NAND介质及Firmware的变化,如某个zone状态的异常变化,namespace里某个属性被更改等。

SPDK FTL体系的应变
在SPDK 19.01 Release中,成功加入了FTL library。通过FTL library及它在Bdev的适配,符合Open-Channel Spec 2.0的SSD可以运行到SPDK bdev框架里面。未来需要通用块层功能的应用,若要运行在Zoned Namespace上,同样需要一个FTL, 来操作仅支持追加写的zone。

为Zoned Namespace 重新编写另外一个FTL,这并不是一个明智的决定,因为两份FTL定会有诸多冗余代码,而且后期的维护代价也较高。SPDK会新添加一个zonedev layer,它为FTL提供所有所需的操作集,从而屏蔽底层Open-Channel, Zoned Namespace, 以及其他各类第三方的非标准Spec的差异。考虑到Zoned Namespace将会被NVMe Spec接纳,zonedev layer 会以Zoned Namespace的定义为标准。Open-Channel设备则需再加入一个OC/Zonedev adapter去将Open-Channel的操作封装适配到zonedev layer中。

图3 SPDK FTL体系的层次

结语

新环境催生出的新需求,催促着存储软件和设备的向前发展。发展路上的百家争鸣,体现着行业的欣欣向荣。每有一方发声,就会有一个新车轮被造出世;今日是靓在台前的新轮子,明日也许就是被丢弃在角落的废轮子。从Open-Channel 1.2到Open-Channel 2.0,再到Zoned Namespace, 主机能够掌控SSD盘上的功能越来越少。Open-Channel的灵活性,Zoned Namespace不能覆盖到所有。所以对某些特定场景和需求,Open-Channel依然是不可替代的。但依然期待Zoned Namespace能作为满足多数应用对QOS及Latency需求的基础,成为合力共造的一个耐用车轮。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/23116.html
分享到:
相关文章
条评论

登录后才可以评论

SDNLAB君 发表于19-04-11
0