The interface has the following key attributes:
- 在命令提交或完成路径中不需要非缓存/ MMIO寄存器读取;
- 在命令提交路径中最多需要一个MMIO寄存器写或一个64B消息;
- 支持多达65,535个I/O队列,每个I/O队列支持多达65,535个未完成的命令;优先级与每个I/O队列相关联,具有良好定义的仲裁机制;
- 完成一个4 KiB读请求的所有信息都包含在64B命令本身中,确保高效的小I/O操作;
- 高效和精简的命令集;
- 支持MSI/MSI- x和中断聚合;
- 支持多个命名空间;
- 高效支持I/O虚拟化架构,如SR-IOV;
- 强大的错误报告和管理能力;
- 支持多路径I/O和命名空间共享。
NVMe 传输模型分类
主机和NVM子系统之间有两个定义的通信结构:
- 一个是基于内存的传输模型
- 一个是基于消息的传输模型。基于消息的传输模型有两种子类型:
- 仅消息传输模型
- 消息/内存传输模型
不同模型在命令、响应、数据传输方式的不同:
- 在基于内存的传输模型中,命令、响应和数据通过显式的内存读写操作在主机和NVM子系统之间输。
- 基于消息的传输模型是指在主机和NVM子系统之间发送包含命令胶囊和响应胶囊的消息。
- 在纯消息传输模型中,数据仅使用胶囊或消息在主机和NVM子系统之间发送。
- 基于消息/内存的传输模型使用消息和显式内存读写操作的组合来在主机和NVM子系统之间传输命令胶囊、响应胶囊和数据。数据可以选择性地包含在命令胶囊和响应胶囊中
namespace定义
名称空间是主机可以访问的一组格式化的非易失性内存。与每个名称空间相关联的是在该名称空间上操作的I/O命令集。一个NVM Express控制器可以支持使用名称空间ID引用的多个名称空间。命名空间的创建和删除可以通过命名空间管理命令和容量管理命令完成。
NVMe命令
NVM Express接口基于成对的提交和完成队列机制。主机软件将命令放入提交队列中。控制器将完成放置到相关的完成队列中。
在NVM Express中定义了三种类型的命令:Admin命令、I/O命令和fabric命令。图5显示了这些不同的命令类型。
- Admin: Admin Submission Queue和相关CQ完成队列是为了控制器的管理和控制而存在的(例如,创建和删除I/O提交和完成队列,中止命令等)。只有属于 Admin Command Set或fabric命令集的命令才能提交到管理提交队列。
- I/O: I/O命令集与I/O队列对一起使用。本规范定义了常用的I/O命令。I/O命令集定义在NVMe I/O命令集规范中(例如,NVM命令集,Key Value命令集或分区命名空间命令集)。
- **Fabrics **: fabric命令集是特定于fabric的NVMe。fabric命令集命令用于特定于NVMe over fabric的操作,包括建立连接、NVMe带内认证、获取或设置属性。所有的fabric命令都可以在管理员提交队列上提交,一些fabric命令也可以在I/O提交队列上提交。与Admin和I/O命令不同,fabric命令由控制器处理,而不管控制器是否启用(即不管CC.EN的状态如何)。
2.1 Memory-Based Transport Model
在基于内存的模型中,提交队列SQ和完成队列CQ分配在内存中。
主机软件创建队列,达到控制器支持的最大队列。通常,创建的命令队列数量取决于系统配置和预期的工作负载。例如,在一个基于4个核心处理器的系统上,每个核心可能有一个队列对,以避免锁定并确保在适当的处理器核心的缓存中创建数据结构。
图6提供了队列对机制,显示了提交队列和完成队列之间的1:1映射
图7展示了一个例子,多个I/O提交队列SQ在核心b上使用相同的I/O完成队列CQ。
图6和图7显示管理提交队列和管理完成队列之间总是存在1:1的映射。
SQ:
提交队列(SQ)是一个具有固定槽大小的环形缓冲区,主机软件使用它来提交命令供控制器执行。
当有1到n个新命令需要执行时,主机软件更新相应的SQ尾门铃寄存器。当有新的门铃寄存器写入时,之前的SQ尾值在控制器中被覆盖。控制器按顺序从提交队列中获取SQ条目,并可以按任何顺序执行这些命令。
每个提交队列条目都是一个命令。命令的大小为64字节。内存中用于数据传输的物理内存位置是使用物理区域页(physical Region Page, PRP)条目或分散聚集列表(Scatter Gather Lists, SGL)指定的。
- PRP: 每个命令可以包含两个PRP条目或一个分散收集列表段。如果需要两个以上的PRP条目来描述数据缓冲区,则提供一个指向描述PRP条目列表的PRP List的指针。
- SGL: 如果需要多个SGL段来描述数据缓冲区,则SGL段提供指向下一个SGL段的指针。
CQ:
完成队列(CQ)是一个具有固定插槽大小的循环缓冲区,用于发布已完成命令的状态。
一个完整的命令是由相关联的SQ标识符和由主机软件分配的命令标识符的组合唯一标识的。在基于内存的传输模型中,多个提交队列可能与单个完成队列相关联。
CQ Head指针在处理完指示最后一个空闲CQ槽的完成队列项后由主机软件更新。阶段标签§位在完成队列条目中定义,用于指示一个条目是否在主机未征询寄存器的情况下被新发布。阶段标签位使主机能够确定条目是否是新的。
2.2 Message-Based Transport Model
用于NVMe over Fabrics的基于消息的传输模型与基于内存的传输模型有以下区别:
- I/O提交队列和I/O完成队列是一一对应的。NVMe over Fabrics不支持将多个I/O提交队列映射到单个I/O完成队列;
- NVMe over Fabrics没有定义允许控制器生成主机中断的中断机制。主机结构接口(例如,主机总线适配器)负责生成主机中断;
- NVMe over Fabrics使用不同的机制创建和删除I/O提交队列和I/O完成队列(请参阅第3.5节);
- NVMe over Fabrics不支持从单独的缓冲区传输元数据(例如,不支持元数据指针字段,参见图87)
- NVMe over Fabrics不支持PRP,但需要为Admin、I/O和Fabrics命令使用sgl。这与基于内存的传输模型不同,在该模型中,Admin命令不支持sgl,而I/O命令是可选的;
- NVMe over fabric不支持完成队列流控制(参见章节3.3.1.2.1)。这要求主机在提交新命令之前确保有可用的完成队列插槽;
- NVMe over Fabrics允许禁用提交队列流控制,如果主机和控制器同意禁用它。如果提交队列流控制被禁用,主机需要确保在提交新命令之前有可用的提交队列插槽。
2.2.1 Fabrics and Transports
NVMe over Fabrics使用图8所示的协议分层。该规范定义了独立于NVMe传输的体系结构的核心方面。NVMe Transport binding规范用于描述任何特定于NVMe传输的特殊化,以及NVMe接口所需的服务如何映射到相应的NVMe传输。NVMe接口和NVMe传输所使用的本机fabric通信服务和其他功能(例如,图8中的fabric Protocol和fabric物理层)不在NVMe规范家族的范围之内。
2.2.2 NVM Subsystem Ports
NVM子系统提供了一个由1到(64Ki - 16)个控制器组成的集合,用于访问namespace。控制器可以通过1 ~ 64Ki的NVM子系统端口与主机关联。
NVM子系统端口是NVM子系统和fabric之间的协议接口。NVM子系统端口是一个或多个物理结构接口的集合,这些物理结构接口一起充当单个协议接口。当使用链路聚合(如以太网)时,聚合链路组的物理端口构成单个NVM子系统端口
一个NVM子系统包含一个或多个NVM子系统端口。
每个NVM子系统端口都有一个16位的端口标识(port ID)。NVM子系统端口由NVM子系统NVMe Qualified Name (NQN)和port ID标识。一个NVM子系统的NVM子系统端口可能支持不同的NVMe传输。如果底层结构存在多个NVMe传输绑定规范,则NVM子系统端口可能支持多个NVMe传输(例如,由port ID标识的NVM子系统端口可能同时支持iWARP和RoCE)。NVM子系统实现可以将特定的控制器绑定到特定的NVM子系统端口,或者允许在NVM子系统端口之间灵活分配控制器,但是,一旦连接,每个特定的控制器都绑定到单个NVM子系统端口。
一个控制器一次只与一个主机相关联。NVMe over fabric允许多个主机通过同一个NVM sybsystem端口连接到NVM子系统中的不同控制器。NVMe over Fabrics多路径I/O和名称空间共享(请参阅2.4.1节)的所有其他方面都与基于内存的传输模型等效。
2.2.3 Discovery Service
NVMe over Fabrics定义了一种发现机制,主机使用该机制确定暴露主机可能访问的名称空间的NVM子系统。Discovery Service为主机提供以下功能:
- 能够发现具有主机可访问的名称空间的NVM子系统列表;
- 能够发现到NVM子系统的多条路径;
- 能够发现静态配置的控制器;
- 可选的能力建立显式持久连接到发现控制器;
- 从发现控制器接收异步事件通知的可选能力
Discovery Service是一个NVM子系统,它只支持Discovery控制器(参考3.1.2.3节),不支持任何其他类型的控制器。主机用于获取连接到初始Discovery Service所需信息的方法是特定于实现的。这些信息可以通过主机配置文件、hypervisor或OS属性或其他机制确定。
2.2.4 Capsules and Data Transfer
Capsules 是用于NVMe over Fabrics的信息交换的NVMe单元。Capsules 可分为指令command Capsules 或响应response Capsules 。command Capsules包含一个命令(格式化为提交队列SQ条目),并且可以选择包含SGL或数据。response Capsules包含响应(格式化为完成队列CQ条目),并可选择包含数据。数据是指主机和NVM子系统之间在NVMe层传输的任何数据(例如,逻辑块数据或与命令关联的数据结构)。一个Capsules 独立于任何底层NVMe传输单元(例如,包、消息或帧以及相关的页眉和页脚),并且可以由多个这样的单元组成。
command Capsules从主机host传输到NVM子系统。SQE包含一个Admin命令、一个I/O命令或一个Fabrics命令。命令舱的最小大小是NVMe传输绑定特定的,但至少应该是64B的大小。命令胶囊的最大大小是NVMe传输绑定特定的。命令胶囊的格式如图9所示
响应胶囊从NVM子系统传输到主机。CQE与以前发布的Admin命令、I/O命令或Fabrics命令相关联。响应胶囊的大小是NVMe运输绑定特定的,但至少应该是16B的大小。响应胶囊的最大大小是NVMe传输绑定特定的。响应胶囊的格式如图10所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5GyeGD1x-1671547411908)(https://xiongyuqing-img.oss-cn-qingdao.aliyuncs.com/blog_img/202212202243820.png)]
使用纯消息传输模型和消息/内存传输模型的NVMe传输要求在命令中传输从主机发送到控制器的所有sgl。它们可以有选择地支持在命令和响应胶囊中传输部分或全部数据。
NVMe over fabric对所有命令(fabric、Admin和I/O)都需要sgl。SGL可以指定数据在胶囊中的位置,或者使用特定于NVMe传输的数据传输机制(例如,通过RDMA中的内存传输)传输数据所需的信息。每个NVMe传输绑定规范都定义了特定NVMe传输所使用的SGL以及任何胶囊SGL和数据放置限制。
2.2.5 Authentication
NVMe over Fabrics既支持fabric安全通道,也支持NVMe带内认证(请参考8.13.1节)。NVM子系统可能要求主机使用fabric安全通道、NVMe带内身份验证或两者兼有。发现服务指示NVM子系统的fabric安全通道应使用。Connect响应指示是否使用该控制器进行NVMe带内身份验证应使用。
与需要fabric安全通道的NVM子系统相关联的控制器在建立安全通道之前不能接受NVMe传输上的任何命令(即fabric命令、Admin命令或I/O命令)。在执行Connect命令后,需要进行NVMe带内身份验证的控制器在NVMe带内身份验证完成之前,将不接受由该Connect命令创建的队列上的除身份验证命令以外的任何命令。参见8.13节。
2.3 NVM Storage Model
2.3.1 Storage Entities
NVM存储模型包括以下实体:
- NVM subsystems(参见1.5.40)
- Domains (参见3.2.4)
- Endurance Groups (参见3.2.3节) 由存储介质组成,称为介质单元(请参阅章节8.3.2)
- NVM Sets(参见3.2.2节)
- Namespaces(请参考3.2.1节)
如下所示,每个Domains包含在单个NVM子系统中,每个Endurance Groups包含在单个域中,每个NVM Set包含在单个Endurance Group中,每个Namespace包含在单个NVM集中。每个Media Unit包含在一个Endurance Group中。为了清晰起见,下面的例子中没有显示媒体单位。
图12显示了这些实体在一个复杂的NVM子系统中的关系,该子系统有多个域,每个域有多个耐力组,每个耐力组有多个NVM集,每个NVM集有多个名称空间:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6rwGR4Zk-1671547411910)(https://secure2.wostatic.cn/static/9gsDn3oaJgueuvDaPds1t7/image.png?auth_key=1671547139-c8mZzgp5Zt1fgM8scFVSCu-0-7c5236418b2ac1a23672843f118d93a2)]
耐力组或NVM集是可选的,但存储模型支持这些概念。NVM子系统可以由供应商提供并配置其存储实体,也可以由客户配置或重新配置。对配置的典型更改是创建和删除名称空间。
2.3.2 I/O Command Sets
I/O命令对命名空间进行操作,每个命名空间只关联一个I/O命令集。例如,“NVM命令”中的命令将namespace中的访问数据设置为逻辑块,“键值命令”中的命令将namespace中的访问数据设置为键值对。
命名空间与I/O命令集的关联是在创建命名空间时指定的,并且在命名空间的生命周期内是固定的。
一个控制器可以支持一个或多个I/O命令集,并且可以附加到与不同I/O命令集相关联的名称空间。主机向名称空间发出命令,这些命令将基于与该名称空间关联的I/O命令集进行解释。
2.3.3 NVM Subsystem Examples
图13展示了一个简单的NVM子系统,每个存储实体都有一个实例。
图14显示了一个具有两个名称空间的NVM子系统。
NVM子系统可能有多个域、多个名称空间、多个控制器和多个端口,如图15所示。
2.4 Extended Capabilities Theory
2.4.1 Multi-Path I/O and Namespace Sharing
介绍多路径I/O和namespace共享的概述。多路径I/O是指一台主机和一个命名空间之间有两条或多条完全独立的路径,而命名空间共享是指两个或多个主机使用不同的NVM Express控制器访问一个公共共享命名空间的能力。多路径I/O和命名空间共享都要求NVM子系统包含两个或多个控制器。支持多路径I/O和命名空间共享的NVM子系统也可能支持非对称控制器行为(请参阅2.4.2节)。两个或多个主机对共享名称空间的并发访问需要主机之间的某种形式的协调。用于协调这些主机的过程超出了本规范的范围。
图16显示了一个包含通过PCI Express实现的单个NVM Express控制器和单个PCI Express端口的NVM子系统。
由于这是一个单一的功能PCI Express设备,NVM Express控制器应该与PCI Function 0相关联。
一个控制器可以支持多个名称空间。图16中的控制器支持标记为NS A和NS b的两个名称空间,与每个控制器名称空间相关联的是标记为NSID 1和NSID 2的名称空间ID,控制器使用它来引用特定的名称空间。
名称空间ID与名称空间本身不同,是主机和控制器用于在命令中指定特定名称空间的句柄。控制器名称空间id的选择超出了本规范的范围。
这两个名称空间都是控制器私有的,这种配置既不支持多路径I/O,也不支持名称空间共享。
图17显示了一个多功能NVM子系统,具有一个PCI Express端口,包含两个通过PCIe实现NVMe的控制器。一个控制器与PCI Function 0相关联,另一个控制器与PCI Function 1相关联。每个控制器都支持单个私有命名空间和对共享命名空间b的访问。在访问特定共享命名空间的所有控制器中,命名空间ID必须相同。在本例中,两个控制器都使用名称空间ID 2访问共享名称空间B。
每个控制器都有一个或多个Identify Controller数据结构,每个名称空间都有一个或多个Identify Namespace数据结构(参见图273)。访问共享名称空间的控制器返回与该共享名称空间关联的Identify namespace数据结构(即,访问相同共享名称空间的所有控制器返回相同的数据结构内容)。有一个与名称空间本身相关联的全局唯一标识符,可用于确定何时有多个路径到同一个共享名称空间。参见4.5.1节。
共享NS的数据一致性:与共享名称空间关联的控制器可以并发地操作该名称空间。各个控制器执行的操作对于提交命令的控制器的写原子性级别的共享名称空间是原子性的(请参阅3.4.3节)。共享NS的控制器之间的写原子性级别不需要相同。如果向访问共享NS的不同控制器发出的命令之间存在任何排序要求,则需要主机软件或相关应用程序来执行这些排序要求。
图18展示了一个带有两个PCI Express端口的NVM子系统,每个端口都有一个通过PCIe实现NVMe的相关控制器。两个控制器都映射到对应端口的PCI Function 0。本例中的每个PCI Express端口都是完全独立的,并具有自己的PCI Express基本复位和参考时钟输入。重置端口只影响与该端口关联的控制器,不影响其他控制器、共享命名空间或其他控制器对共享命名空间的操作。本例的函数行为与图17所示的相同。
图18中所示的两个端口可以与相同的根复合体相关联,也可以与不同的根复合体相关联,并且可以用于实现多路径I/O和I/O共享架构。系统级体系结构方面和PCI Express结构中多个端口的使用超出了本规范的范围。
图19展示了一个支持单根I/O虚拟化(SR-IOV)的NVM子系统,它有一个物理功能和四个虚拟功能。通过PCIe实现NVMe的NVM Express控制器与每个函数相关联,每个控制器都有一个私有命名空间,并访问由所有控制器共享的命名空间,标记为NS F。本例中控制器的行为与本节中其他示例的行为相似。有关SR-IOV的更多信息,请参阅第8.26.4节。
2.4.2 Asymmetric Controller Behavior
非对称控制器行为发生在NVM子系统中,其中命名空间访问特征(例如,性能)可能基于以下因素而变化:
- NVM子系统的内部配置;
- 使用哪个控制器访问命名空间(例如,Fabrics)。
如8.1节所述,提供非对称控制器行为的NVM子系统可能支持非对称命名空间访问