《NVMe-over-Fabrics-1_0a-2018.07.23-Ratified》阅读笔记(1)

1 引言(入门介绍)

NVMe版本1.2.1和之前的版本为主机软件与非易失存储系统通过PCIe通信定义了寄存器级接口。本规格说明书定义了对NVMe的扩展,启用通过其他网络互联上的操作(NVMe over Fabric)。参考的NVMe基础规格说明书是NVMe版本1.2.1。

本文档内对特定NVMe传输层定义的扩展描绘在NVMe传输层约束规格说明书中。这个文档包含一个RDMA的NVMe传输层约束规格说明书。Fibre Channel(FC)的NVMe传输层约束规格说明书定义在INCITS540 FC-NVMe中(参考http://www.incits.org)。

1.1 范围

本NVMe over Fabric规格说明书定义NVMe的扩展,不同于PCIe而是启用over Fabric操作。这个规格说明书补充了NVMe基础规格说明书。

1.2 范围之外的

仅仅适用于NVMe over PCIe的功能,以及虽然NVMe over PCIe和NVMe over Fabric二者都适用但在NVMe基础规格说明书中已经明确的功能,都不再包含在此规格说明书中了。

本规格说明书定义了与具体实现无关的需求和行为。需求和行为的实现超出了本规格说明书。例如,遵循此规格说明书的NVM subsystem可以由直接连接到网络上的SSD实现,或者在中间一个把网络转成PCIe NVMe SSD的设备上实现,或者在一个通用目的的服务器上运行的软件实现。

NVMe over Fabric 版本1.0从定义必要功能的角度故意做了限制。在后续版本可能会被删掉的限制条件包括:

  • 单个SQ和单个CQ必须1:1的一对一映射关联。NVMe over Fabric不支持多个SQ对应一个CQ;
  • 在NVMe层对completion没有流量控制。因此,CQ深度应当支持到最大数量待处理命令的大小;
  • 如果支持元数据,那么元数据作为逻辑块的连续部分传输,特别是作为一个单独分开的数据的缓冲区来传输是不支持的。

本文档中提及的其他出版的规范,甚至合规的要求,都超出了这个规格说明书的范围;包括本文档或任何NVMe传输层约束规格说明书中提及的已发布的网络和其他技术规范。

1.4 术语

1.4.1 association

一个特定的controller和一个特定的主机之间的一种排他性的关联关系,包括这个controller上的Admin队列和所有I/O队列。

1.4.2 认证命令

用于网络相关的认证发送或认证接收命令。

1.4.3 capsule

NVMe over Fabric中一个NVMe的信息交换单元。一个capsule包含一个命令或应答,还可能包含命令/应答的数据和SGLs【注:SGL是聚散列表】。

1.4.4 Discovery controller

支持最少功能,仅仅实现所需的特性获取允许的Discovery Log Page,这样的一个controller。Discovery controller不实现I/O队列,也不对外呈现namespace。

1.4.5 Discovery服务

Discovery服务是一个只支持Discovery controller的NVM subsystem。Discovery服务不要支持能呈现namespace的controller。

1.4.6 动态controller

按需分配的controller,它在association关联之前无状态保存。

1.4.7 fabric(network fabric)

承载多节点间相互数据传输的网络拓扑。

1.4.8 NVMe Transport

一个在主机和NVM subsystem之间对数据、命令和应答提供可靠递送交付的协议层。NVMe Transport(传输层)位于网络拓扑之上,他依赖网络拓扑的物理互联和下层网络协议层。

1.4.9 NVMe Transport binding specification

NVMe传输约束规范,在主机和NVM subsystem之间为NVMe传输层可靠地交付数据、命令和应答的规范。这个约束可能基于NVMe传输的能力排除和限制。

1.4.10 端口 port(NVM subsystem port)

port是指NVM subsystem和fabric之间的一个NVMe over Fabric协议接口。一个NVM subsystem port是一个或多个物理Fabric接口的集合,它们共同作为一个接口。

1.4.11 port ID

端口标识,一个关联到NVM subsystem port的16 bit 标识。

1.4.12 property(属性)

对应于定义在NVMe over PCIe上controller寄存器,内存布置的一种广义和泛化。property们用于配置低层控制器属性并获得低层控制器状态。

1.4.13 静态controller

在关联之前已经存在有状态保存并被指定controller ID的controller。

1.4.14 命令提交

当主机把一个capsule放入了SQ就算一个命令被提交。主机增加尾部项指针指向新提交命令在SQ中的位置。

1.4.15 物理网络拓扑接口(物理端口)

NVM subsystem和网络拓扑之间的物理连接。

1.5 操作原理

NVMe over Fabric建立在NVMe基础规格说明书中定义的架构、命令集、队列接口基础之上。NVMe over Fabric的一个核心目标是让为了支持通用网络拓扑而仅有的必要偏差与基本定义保持一致性。NVMe over Fabric扩展定义包括:

  • capsule的使用,为命令、应答、以及可选的数据传送,新定义了capsule的概念来使用;
  • SGL的扩展,为支持capsule中的数据像NVMe传递那样利用key/offset内存寻址样式,扩展了SGL;
  • 排队模型的扩展,启用某些底层NVMe传输层提供的潜在功能能力;
  • 主机建立一个连接的方法,连接是指主机到特定NVM subsystem里一个controller的Admin队列或I/O队列的连接。这个方法包括一个可以被用于验证主机和controller身份标识的认证步骤;
  • 对properties相应controller PCIe内存映射I/O(MMIO)寄存器的泛化,可以被主机通过任意NVMe传输层访问;
  • 为主机判断有哪些NVM subsystem可以被访问增加了discovery机制。

NVMe over Fabric与NVMe基础规范有如下不同点:

  • I/O提交队列和I/O完成队列一对一映射关系。NVMe over Fabric不支持多I/O提交队列映射同一个I/O完成队列;
  • NVMe over Fabric没有定义让controller去产生一个主机中断的中断机制,产生主机中断是主机网络接口(主机总线适配器HBA)的职责;
  • NVMe over Fabric不使用创建I/O完成队列、创建I/O提交队列、删除I/O完成队列、删除I/O提交队列命令。NVMe over Fabric不使用Admin提交队列基地址(AQA)属性。创建队列使用Connect Fabric命令;
  • 如果支持元数据,应该作为逻辑块一个连续的部分来传送。NVMe over Fabric不支持从一个单独分开的缓冲区传递元数据;
  • NVMe over Fabric不支持PRPs ,需要为Admin、I/O、Fabric命令使用SGLs。这些与NVMe over PCIe的差异是:NVMe over PCIe的Admin命令不支持SGL,NVMe over PCIe的I/O命令使用SGL也是可选的;
  • NVMe over Fabric不支持完成队列流量控制。这要求主机在提交命令之前确保有空闲的完成队列槽位。

虽然NVMe over Fabric与NVMe over PCIe实现存在差异,但都执行相同的架构和命令集。共同的特征包括:

  • 有限数量的主机controller接口;
  • 优化的命令提交和完成路径;
  • 支持并行操作,每个controller最大可支持到64k-1个I/O队列,每个队列可最大支持64k-1个待处理命令;
  • 支持一些企业级功能,例如端到端的数据保护;
  • 健壮的错误报告和管理功能;
  • 每个I/O队列分配优先级,使用定义明确的controller队列仲裁机制;
  • 高效和改进的命令集;
  • 支持多namespace和namespace管理;
  • 支持多路径I/O和namespace共享。

1.5.1 网络结构和传输层

NVMe over Fabric要求下边的NVMe传输层支持可靠的NVMe命令和数据传递交付。NVMe传输层是一个抽象的协议层,它不依赖于任何物理互联特性。

下图例子Figure 1展示的一种NVMe传输层分类方式。NVMe传输层可以表现为内存模型,消息模型,或者二者的组合。内存模型是通过执行显示内存读写操作来为网络中的节点之间传递命令、应答和数据。而消息模型是只在网络的节点之间发送包含命令capsule,应答capsule和数据的消息。一个message/memory模型使用消息和显示内存读写操作的组合在网络节点之间来传递命令capsule、应答capsule和数据。在命令capsule和应答capsule中是否包含数据时可选的。

被NVMe支持的内存模型NVMe传输层只有PCIe,它在NVMe基础规格说明书中定义。消息模型和message/memory模型NVMe传输层在本文档中详细说明。

NVMe over Fabric使用的协议分层如图Figure 2所示。本规格说明书定义独立于NVMe传输层架构的核心外貌。NVMe传输层约束规范用于描述相应的NVMe传输特定专门链路,以及NVMe接口所需的服务如何映射到相应的NVMe传输。原生的网络通信服务和其他功能如何被NVMe接口和NVMe传输(例如Figure 2中网络协议和网络物理层)使用超出了本规格说明书的范围。

1.5.2 NVM subsystem

NVMe over Fabric建立在NVMe基础规格说明书定义的NVM subsystem架构之上。一个NVM subsystem表示一个1至(64k-16)个用于访问namespace的controller的集合。controller可以通过1到64K个NVM subsystem端口(ports)与主机们相关联。

NVM subsystem port是一个NVM subsystem与网络之间的协议接口。一个NVM subsystem port是一个由一个或多个物理网络接口的聚集,聚合在一起作为一个单个协议接口。当使用了链路聚合,聚合链路组中的这些物理端口组成一个单个的NVM subsystem port。

一个NVM subsystem包含一个或多个NVM subsystem port。【注:有些地方描述时可能把NVM subsystem port写成了NVM subsystem端口】

每个NVM subsystem port有一个16 bit位的端口标识(Port ID)。一个NVM subsystem port 由 NVM subsystem NQN和Port ID来进行辨识确定。NVM subsystem的port们可以支持不同的NVMe传输。如果在底层网络中存在多种NVMe传输层类型,一个NVM subsystem port可以支持多个NVMe传输层类型(例如同一个Port ID的一个NVM subsystem端口可以支持iWARP和RoCE)。一个NVM subsystem的实现,可以让特定的controller与特定的ports绑定,或者也可以把ports灵活的分配到controller,但是,一旦连接成功之后,每个特定的controller被绑定到一个单个的NVM subsystem port上。

一个controller在同一时间只关联到一个恰当的主机。NVMe over Fabric允许多主机通过同一个port连接到不同的controller。NVMe over Fabric的其他方面,多路径I/O和namespace共享都等同于NVMe基础规格说明书中的定义。

一个NVM subsystem是否包含非易失存储媒介,以及NVM subsystem的controller与非易失存储媒介之间的接口,是不确定的,可选的。controller通过namespace向主机呈现非易失存储媒介。NVM subsystem不要求同一个namespace挂载到所有的controller上。一个NVM subsystem可以支持呈现namespace的或者Discovery功能的controller;但是不能是混合的controller类型,一个Discovery Service是一个只对外呈现Discovery controller的NVM subsystem。

当主机使用Fabric Connect命令连接到controller的Admin队列,就算是主机与controller建立好了关联关系(请参考第3.3章节)。在Connect命令里,主机指定主机NQN,NVM Subsystem NQN,主机ID标识,还可能指定有权访问的有效controller的Controller ID。同一时间一个controller只能有一个association【与主机的关联】。

NVM subsystem可以支持动态或静态controller模型。动态模型,controller是被NVM subsystem按需申请的,新申请的controller不包含先前的关联状态。静态模型,主机可以基于controller ID请求特定的controller,之前的关联状态(特性设置)是保存的。请参考第4.2章节。

主机和controller存在关联后,只有这个主机可以使用该controller的I/O队列建立连接,在随后的Connect命令带有相同的主机NQN,主机ID,NVM Subsystem NQN和Controller ID使用相同的NVM subsystem port,NVMe Transport类型,以及NVMe Transport地址。

association的存在会持续到controller关闭,或一个Controller Level Reset,或主机与controller之间的NVMe Transport连接丢失。断开主机和controller之间NVMe Transport连接没有明确的命令。当controller与一个主机关联后,controller处于忙状态,不能与这个controller再建立其他关联了。

1.5.3 Capsule和Data Transfer

capsule是在NVMe over Fabric中使用的一个NVMe信息交换单元。capsule可以分成命令capsule和应答capsule。命令capsule里边包含一个命令(作为SQ Entry格式的)和SGLs或数据,SGLs或数据这部分内容是可选的,有些命令capsule中没有这些内容。应答capsule中包含一个response应答(CQ Entry格式的)和数据,这里数据时可选的。capsule描述中说的数据指的是主机和NVM subsystem之间在NVMe层传输的任意数据(例如逻辑块数据或者命令相关的数据结构)。capsule独立于下边所有NVMe Transport单元(例如packet、message或frame和相关头部和尾部)和可能多个这样的单元。

命令capsule从主机传送到NVM subsystem。SQE包括Admin命令、I/O命令、或Fabric命令。命令capsule大小的最小值是NVMe传输层约束指定,但至少是64字节。最大命令capsule大小也是NVMe传输层约束指定。命令capsule格式如下图Figure 3所示。

 应答capsule被从NVM subsystem传送到主机。应答capsule最前边是CQE部分,是Admin命令,I/O命令,或Fabric命令的应答。应答capsule的最大长度和最小长度也是由NVMe传输层约束指定的,格式如下图Figure 4所示。

 

Message和Message/Memory模型NVMe传输要求所有从主机发送到controller的SGLs都在命令里传送。对于Message和Message/Memory模型,部分或全部的数据是否支持在命令或应答里是可选的。

NVMe over PCIe命令使用PRPs和可选的SGLs来指定数据传送范围。NVMe over Fabric要求所有命令用SGLs(Fabric、Admin、I/O命令都用SGLs)。SGL可以指定数据在capsule中的位置,或者使用NVMe传输特定数据传输机制传输数据所需的信息(例如RDMA中传输)。NVMe传输层约束规格说明书定义对应NVMe传输类型的SGLs,以及capsule SGL与数据放置的限制。

1.5.4 命令集

如图Figure 5所示,NVMe over Fabric支持三种命令集。Fabric命令集是NVMe over Fabric指定的,Admin和I/O命令集在NVMe基础规格说明书中定义。

Fabric命令集中的命令用于针对NVMe over Fabric的操作,包括建立连接,NVMe 带内认证,获取或设置property。所有Fabric命令可以被提交到Admin队列,有些Fabric命令也可以提交到I/O队列,不同于Admin和I/O命令,Fabric命令不论controller是否为enabled(CC.EN的状态)都需要处理。

本规格说明书假定SQE大小为64字节,CQE大小为16字节,同NVM命令集中定义的那样。

1.5.5 Properties

Properties是NVMe over Fabric对NVMe over PCIe中定义的内存映射到NVMe controller寄存器的模拟。Properties被用于配置controller属性的子集和获取状态的子集。

主机可以通过Property Get命令获取property的值,可以用Property Set命令修改property值,Property Get命令和Property Set命令都归属Fabric命令集。Properties只能通过Admin队列来访问。

有些controller寄存器或域是特定于PCIe功能的(例如门铃寄存器),它们不用在NVMe over Fabric里。结果就是部分NVMe基础规格说明书中定义的controller寄存器和域用于NVMe over Fabric(请参考第3.5.1章节)。

1.5.6 Discovery

NVMe over Fabric定义了一个Discovery机制,用于主机确定主机可以访问的NVM subsystem。Discovery controller支持最少的功能,仅执行请求运行检索Discovery Log Page的特性。Discovery controller不执行I/O队列也不呈现namespace。Discovery服务是一个只含Discovery controller的NVM subsystem。

Discovery controller提供的Discovery Log Page包含一个或多个条目项,每项指定主机通过NVMe传输层连接NVM subsystem所必须的信息。条目项中可能指定了主机可以访问的呈现namespace的NVM subsystem,也可能推荐了另一个Discovery服务。最大推荐深度为8级。

主机获取必要信息来连接到初始Discovery服务的方法是特定于具体实现的。这些信息或许用一个主机配置文件确定,一个管理程序或OS属性或一些其他机制。

1.5.7 Connection

NVMe over Fabric使用Connet命令来创建controller Admin队列或I/O队列。管理队列的创建在主机和相应的控制器之间建立了关联。NVMe over Fabric不支持Admin Submission Queue Base Address(ASQ),Admin Completion Queue Base Address(ACQ),Admin Queue Attributes(AQA)properties,而连接到Admin队列的所有必要信息都包含在Connect命令里。NVMe over Fabrics不支持NVMe基础规格说明书中定义的用Admin命令进行的I/O队列创建和删除。

NVMe Transport连接是主机和NVM subsystem之间传送capsule或数据之前建立起来的。用于建立NVMe Transport连接的机制是NVMe Transport特定的,由相应的NVMe传输层约束规格说明书定义。NVMe Transport可能需要独立分开NVMe Transport连接来作为每个Admin或I/O队列,也可能利用特殊的controller让所有Admin和I/O队列使用同一个NVMe传输层连接。在建立NVMe传输连接的过程中,NVMe传输还可能要求在主机和控制器之间传递NVMe层信息(例如:exchange队列大小来适应发送和接收缓冲区大小)。

Connect命令指定Queue ID和类型(Admin或I/O),SQ和CQ的大小,队列属性,Host NQN,NVM subsystem NQN,以及主机ID标识。如果NVM subsystem支持静态controller模型,Connect命令可以指定特定的controller。Connect response应答中指示是否已经建立连接成功,是否要求NVMe带内认证。

Connect命令被提交到它创建的同一个管理队列或I/O队列。首先创建用于该队列的底层NVMe传输连接,然后通过该NVMe传输连接发送Connect命令和应答capsule。只能发送一次Connect命令到一个队列。

当Connect命令成功完成,相应的SQ和CQ都被创建好了。如果Connect应答中指示需要NVMe带内认证,那么在执行Fabrics/Admin/IO命令集之前先执行NVMe带内认证。从Connect命令在Admin队列上成功完成,到controller准备好(CSTS.RDY=1)之前,只能提交Fabrics命令。当controller准备好之后Fabrics命令和Admin命令都可以向Admin队列上提交了。对于I/O队列的Connect命令,只能等到controller准备好之后才可以提交。I/O队列上Connect命令成功完成之后(如果要求NVMe带内认证那么就是认证成功后)就可以向这个队列上提交I/O命令了。

Connect应答内容包括分配给主机的controller ID。所有后续Connect命令创建与此controller相关的I/O队列必须来自同一个主机,使用同一个NVMe Transport,有同一个主机标识,主机NQN,NVM subsystem NQN;如果其中的任一条件不符合那么Connect命令就失败。

1.5.8 认证

NVMe over Fabrics既支持网络安全通道也支持NVMe带内认证。NVM subsystem可以要求主机使用网络安全通道,NVMe带内认证,或者二者都要求。Discovery服务指示是否对这个NVM subsystem必要使用网络安全通道。Connect应答指示是否需要对这个controller使用NVMe带内认证。

在建立安全通道之前,与需要网络安全通道的NVM subsystem相关联的controller不能接受NVMe传输上的任何命令(Fabrics、Admin或I/O)。Connect命令之后,要求NVMe带内认证的controller,只到NVMe带内认证成功完成,这个controller除了认证命令外不能接受任何其他命令。请参考第6章。

猜你喜欢

转载自www.cnblogs.com/JamesLi/p/11342031.html