45

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

 5 years ago
source link: https://www.sdnlab.com/23116.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

作者简介:刘孝冬,资深工程师 ,主要从事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硬盘相符。

000.jpg

Zone状态转换

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

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

001.jpg

图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).

002-.jpg

图2 Zone software stack in LinuxKernel

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

Java
dmzadm –format /dev/sdb
1
dmzadmformat/dev/sdb

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

Java
dmsetup create dmz-sdb
1
dmsetup create dmz-sdb

命令执行完毕后,相应的通用块设备会出现为/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中。

003.jpg

图3 SPDK FTL体系的层次

结语

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK