NVMe的Queue与命名空间


本文属于《 NVMe协议基础系列教程》之一,欢迎查看其它文章。

1 概述

NVM Express (NVMe)是一个寄存器级接口,用来实现主机软件与非易失性存储器子系统通信。该接口针对企业和客户端固态驱动器进行了优化,通常附加到PCI Express接口。该接口的目标是在客户端和企业系统中使用。
此外,该规范还定义了一个用于NVM子系统的标准命令集

2 操作原理

NVM Express是一种可扩展的主机控制器接口,旨在满足利用基于PCI Express的固态驱动器的企业和客户端系统的需求。
该接口提供了优化的命令提交和完成路径。它支持多达65,535个I/O队列,每个l/O队列最多可执行64K个未完成命令,从而支持并行操作。此外,还增加了对许多Enterprise功能的支持,例如端到端数据保护(与T10 DIF和SNIA DIX标准兼容)、增强的错误报告和虚拟化。

该接口具有以下关键属性:

  • 不需要在命令提交或完成路径中,读取不可缓存或MMIO寄存器。
  • 在命令提交路径中,最多需要一个MMIO寄存器写入。
  • 支持多达65535个I/O队列,每个I/O队列最多支持64K未完成命令。
  • 优先级与每个I/O队列相关联,具有良好定义的仲裁机制。
  • 完成4KB读请求的所有信息都包含在64B命令本身中,从而确保高效的小I/O操作。
  • 高效和精简的命令集。
  • 支持MSI/MSI- x和中断聚合。
  • 支持多个命名空间。
  • 有效支持I/O虚拟化架构,如SR-IOV。
  • 健壮的错误报告和管理能力。
  • 支持多路径I/O和命名空间共享。

本规范定义了一组精简的寄存器,其功能包括:

  • 控制器capabilities指示
  • 控制器故障Status(命令状态直接通过CQ处理)
  • Admin Queue配置(I/O Queue配置通过Admin commands处理)
  • Doorbell寄存器,可扩展提交队列和完成队列的数量

NVM Express控制器与单个PCI Function相关联。控制器支持的capabilities在Controller Capabilities (CAP) register中指明,并作为Controller和Namespace数据结构的一部分,被Identify命令返回。

  • Identify Controller数据结构,表示应用于整个控制器的capabilities和settings。
  • Identify Namespace数据结构,表示特定于特殊命名空间的capabilities和settings。

2.1 Queue基本原理

NVMe使用循环队列(Queue)传递消息,例如命令和命令完成通知。Queue可以位于主机PCle内存中的任何位置。

  • 通常,Queue位于主机内存中;
  • Queue可以由连续的物理内存块或可选的物理内存块组成不连续的物理内存页集(由PRP列表定义);
  • Queue由一组固定大小的元素组成。

Queue本质上,是具有固定大小的环形缓冲区,其逻辑视图和物理视图,如下所示:

Tail

  • 指向下一个空闲元素;
  • 如果将一个元素添加到tail所指向的元素中,则tail将加1,以指向下一个空闲元素。

Head

  • 如果队列不为空,则指向下一个要删除的条目;
  • 如果一个元素从head所指向的元素中被移除,那么head的值会加1,指向下一个元素。

Queue Size(可用)

  • 队列中的条目数- 1
  • 最小大小为2,I/O Queue最大值为64K,Admin Queue的最大值为4K

Queue Empty

  • Head == Tail

Queue Full

  • Head == Tail + 1 mod Of Queue Entries.

2.2 Admin与I/O Queue

Queue按Command划分,有2种类型,即:

  • Admin Queue
    它是为了控制器管理和控制而存在的,通常用于配置I/O Queue和控制器/特性管理。
    此Queue对应Admin Command Set,也就是说,只有属于Admin Command Set的命令才能提交到Admin Submission Queue。
    每个NVMe控制器有一个Admin Queue,每个Admin Queue最多有4K个元素。

  • I/O Queue
    用于提交/完成IO命令。
    此Queue对应IO Command Set,也就是说,只有属于IO Command Set的命令才能提交到I/O Submission Queue。
    每个NVMe控制器最多64K个I/O Queue,每个I/O Queue最多64K个元素。

2.3 Submission与Completion Queue

Queue按功能划分,也有2种类型,即:

  • Submission Queue(SQ)
    用于从主机向NVMe控制器,提交命令,以供控制器执行;通过SQ ID识别。

  • Completion Queue(CQ)
    用于从NVMe控制器向主机,为完成的命令,返回执行结果状态;通过CQ ID识别。对于每个Completion Queue,可以有一个独立的MSI-X中断。

因此,对于Admin Command Set,就有Admin Submission Queue和Admin Completion Queue。
对于IO Command Set,就有I/O Submission Queue和I/O Completion Queue。
我们捋一捋,其实一共就这4种Queue,他们的含义,如下所示:

  • Admin Submission Queue
    向NVMe控制器提交管理类命令,供控制器执行。
  • Admin Completion Queue
    向主机返回管理类命令,执行结果状态。
  • I/O Submission Queue
    向NVMe控制器提交IO命令,供控制器执行。
  • I/O Completion Queue
    向主机返回IO命令,执行结果状态。

2.4 Submission与Completion Queue对应关系

NVM Express基于成对的Submission和Completion Queue机制

  • 命令由host软件放入提交队列。
  • Completions由控制器放置到相关的完成队列中。
  • 多个提交队列可能使用同一个完成队列。
  • 提交队列和完成队列在主机内存中分配。

一对Admin Submission QueueAdmin Completion Queue是为了控制器管理和控制而存在的(例如,I/O Submission Queue和I/O Completion Queue的创建和删除,中止命令等),只有属于Admin Command Set的命令才能提交到Admin Submission Queue。

I/O命令集与I/O队列成对一起使用。本规范定义了一个I/O命令集,命名为NVM命令集。主机选择一个I/O命令集用于所有I/O queue对。

Host软件创建队列,可以达到控制器支持的最大队列数。通常,创建的命令队列数量取决于系统配置和预期的工作负载。
例如,在一个基于4个核心处理器的系统上,每个核心可能有一个queue对,以避免锁定并确保在适当的处理器核心的缓存中创建数据结构。

图1,提供了queue对机制的图形表示,显示了Submission Queues和Completion Queues之间的1:1映射。
在这里插入图片描述

图2,展示了一个例子,多个I/O Submission Queues利用了Core B上相同的I/O Completion Queues。
在这里插入图片描述
图1和图2显示了Admin Submission Queue和Admin Completion Queue之间总是存在1:1的映射。

  • Submission Queue (SQ)

Submission Queue (SQ)是一个具有固定槽大小的环形缓冲区,Host软件使用它来提交命令供控制器执行。当有1到n个新命令需要执行时,Host软件更新相应的SQ Tail doorbell register。当有新的doorbell register写入时,之前的SQ Tail值在控制器中被覆盖。控制器从Submission Queue中按顺序获取SQ条目,但是,它可以以任何顺序执行这些命令。

每个Submission Queue条目都是一个命令,命令大小为64字节。主机内存中用于数据传输的物理内存位置是使用Physical Region Page(PRP)项或Scatter Gather Lists指定的。每个命令可以包括两个PRP条目或一个Scatter Gather List (SGL)段。如果描述数据缓冲区需要两个以上的PRP项,则提供一个指向PRP链表的指针,该链表描述了PRP项的列表。如果需要多个SGL段来描述数据缓冲区,则SGL段提供一个指向下一个SGL段的指针。

  • Completion Queue(CQ)

Completion Queue(CQ)是一个具有固定槽大小的环形缓冲区,用于为完成的命令投递状态。一个完成的命令,由SQ标识符和命令标识符(由Host软件分配)的组合,唯一地标识。多个提交队列可以关联到一个完成队列。当单个工作线程通过一个完成队列处理所有命令完成时,即使这些命令来自多个提交队列,也可以使用此功能。在处理完最后一个空闲completion queue项之后,Host软件会更新CQ Head指针。在completion queue项中定义了一个Phase位,表示该项是否在未查询寄存器的情况下新发布。这使主机软件能够确定新条目是否作为前一轮或当前轮完成通知的一部分发布。具体来说,每一轮通过Completion Queue条目,控制器反转Phase位。

3 多路径I/O和命名空间共享

多路径I/O和命名空间共享,都要求NVM子系统包含两个或多个控制器
两台或多台主机对共享命名空间的并发访问,需要主机之间进行某种形式的协调。用于协调这些主机的过程,NVMe协议规范未进行约定。

  • 多路径I/O,是指一台主机和一个命名空间之间有两条或多条完全独立的物理PCI Express路径。
  • 命名空间共享,是指两台或更多主机使用不同的NVM Express控制器访问一个公共共享的命名空间的能力。

3.1 1Port+1Controller

图3,显示了一个NVM子系统,它包含一个NVM Express控制器和一个PCI Express端口。由于这是一个单一Function的PCI Express设备,NVM Express控制器应该与PCI Function 0相关联。一个控制器可以支持多个命名空间。
在这里插入图片描述
图3中的控制器,支持NS A和NS B两个命名空间,与每个控制器命名空间相关联的是命名空间ID,分别标记为NSID 1和NSID 2,由控制器用于引用特定的命名空间。

命名空间ID,不同于命名空间本身,它是主机和控制器用于在命令中,指定特定命名空间的句柄。控制器的命名空间id到命名空间的映射,NVMe规范未做约定。

在本例中,命名空间ID 1与NS A相关联,命名空间ID 2与NS B相关联。这两个命名空间都是控制器私有的,本配置不支持多路径I/O,也不支持命名空间共享。

3.2 1Port+2Controller

图4,显示了一个多Function NVM子系统,其中一个PCI Express端口包含两个控制器,一个控制器关联PCI Function 0,另一个控制器关联PCI Function 1。每个控制器,支持单个私有命名空间和对共享命名空间B的访问。在所有访问特定共享命名空间的控制器中,命名空间ID必须相同。在本例中,两个控制器使用命名空间ID 2,访问共享命名空间B。
在这里插入图片描述
每个控制器都有一个唯一的Identify Controller数据结构,每个命名空间都有一个唯一的Identify Namespace数据结构。

访问共享命名空间的控制器,返回与该共享命名空间相关联的Identify Namespace数据结构(即,访问同一个共享命名空间的所有控制器,都返回相同的数据结构内容)。在Identify Namespace数据结构中,EUI64 (IEEE Extended Unique Identifier, IEEE扩展唯一标识符)字段是一个全局唯一的名称,与命名空间本身相关,可用于确定是否有两个或多个控制器访问同一个共享命名空间。

与共享命名空间关联的控制器,可以并发地操作该命名空间。各个控制器执行的操作,在命令提交到的控制器的写原子性级别上,是原子到共享命名空间的。共享命名空间的控制器之间,不要求写原子性级别相同。如果,在发送给访问共享命名空间的不同控制器的命令之间,存在任何顺序要求,则需要宿主软件或相关应用程序,来强制执行这些顺序要求。

3.3 2Port+2Controller

图5,说明了具有两个PCI Express端口的NVM子系统,每个端口都有一个相关的控制器。两个控制器,都映射到对应端口的PCI Function 0。在这个例子中,每个PCI Express端口都是完全独立的,并且有自己的PCI Express基本复位和参考时钟输入。端口复位,只影响该端口关联的控制器,对其他控制器、共享命名空间和其他控制器对共享命名空间的操作没有影响。这个例子的Function行为,在其他方面与图4所示的相同。
在这里插入图片描述
图5中显示的两个端口,可能与相同的Root Complex或不同的Root Complex相关联,并且可能用于实现多路径I/O和I/O共享体系结构。系统级别的体系结构方面和PCI Express fabric中多个端口的使用,不在NVMe规范约定范围。

3.4 SR-IOV

图6,展示了一个支持单根I/O虚拟化(SR-IOV)的NVM子系统,它具有一个物理Function和四个虚拟Function。NVM Express控制器与每个虚拟Function相关联,每个控制器都有一个私有命名空间,并可以访问所有控制器共享的命名空间,命名为NS E。本例中控制器的行为,与本节中其他示例的行为类似。
在这里插入图片描述
本节提供的示例,旨在说明概念,并不打算列举所有可能的配置。例如,NVM子系统可能包含多个PCI Express端口,每个端口都支持SR-IOV。

### 回答1: NVMe 1.4 PDF是指NVMe(Non-Volatile Memory Express)1.4技术规范的PDF版本。NVMe是一种用于固态硬盘驱动器(SSD)和其他非易失性存储设备的专有通信协议。 NVMe 1.4是一项新的技术规范,旨在改进存储设备的性能和功能。它包含了许多新的功能和改进,使得存储设备能够更好地应对现代数据中心和企业存储需求。 NVMe 1.4 PDF提供了这个技术规范的完整文档,其中包含了所有关于NVMe 1.4协议的详细信息。这个文档可以帮助硬件制造商、软件开发人员和系统管理员更好地了解和实现NVMe 1.4协议。 在NVMe 1.4 PDF中,你可以找到关于NVMe命名空间(Namespace)管理、队列管理、错误处理、安全和认证、电源管理等方面的细节。它还提供了关于控制命令、队列命令和传输命令等方面的详细说明。 NVMe 1.4 PDF还提供了一些在NVMe技术中使用的高级功能的详细信息,如多队列、SR-IOV(Single Root I/O Virtualization)和NVMe over Fabrics等。 总之,NVMe 1.4 PDF是一份关于NVMe 1.4技术规范的完整文档,其详细描述了这一新的存储设备通信协议的各个方面。这个文档对于存储行业的专业人士来说是非常有价值的参考资料。 ### 回答2: NVMe 1.4 PDF(英特尔非易失性内存快速存储扩展接口1.4的PDF文档)是关于NVMe 1.4标准的详细说明文件。它是为了帮助开发者、厂商和用户更好地理解和实现NVMe 1.4接口而创建的。 NVMe是一种快速、低延迟的存储协议,用于连接非易失性存储设备,如固态硬盘(SSD)。而NVMe 1.4则是该协议的最新版本,相比以往版本有了一些重要的改进。 NVMe 1.4 PDF文档提供了关于NVMe 1.4协议的全面解释和描述。它详细介绍了NVMe的架构、命令和特性,以及之前版本的区别。此外,它还包含了一些示例代码和配置指南,以帮助开发者更好地理解和使用NVMe 1.4接口。 NVMe 1.4 PDF文档的内容对于存储设备制造商和开发者来说非常有用。它们可以通过研究该文档,了解NVMe 1.4接口的工作原理和要求,并相应地设计和实施自己的产品。此外,用户也可以通过阅读该文档,了解他们所使用和购买的存储设备是否符合NVMe 1.4标准,并了解其性能和兼容性。 总而言之,NVMe 1.4 PDF是一份重要的文档,它提供了关于NVMe 1.4协议的详细说明和指导。无论对于存储设备制造商、开发者还是用户来说,了解NVMe 1.4标准都是非常有益的。 ### 回答3: NVMe(Non-Volatile Memory Express)是一种用于固态硬盘(SSD)的接口协议。NVMe 1.4是NVMe协议的最新版本,于2019年发布。 NVMe 1.4引入了一些新功能和改进,旨在提升SSD的性能和功能。其中,最显著的改进是引入了Zoned Namespaces(ZNs)和多队列(Multi-Queue)功能。 ZNs允许SSD将存储空间分为逻辑区域,这样可以更好地管理和优化数据的存储和访问。这有助于提升SSD的写入性能和耐用性,尤其在需要大量连续写入数据的应用场景下。 多队列功能则可以提高多核处理器系统中的多线程并发访问性能。通过将队列CPU核心进行分离,可以实现更高效的并发读写操作。这对于服务器和数据中心等高负载环境下的应用非常重要。 此外,NVMe 1.4还提供了更丰富的错误处理和调试功能,使得开发人员可以更容易地查找和解决问题。同时,该协议还支持更多的安全功能,例如硬件加密和信任模型,以保护存储的数据安全。 总之,NVMe 1.4是一项重要的技术进步,将进一步推动SSD的发展并提升存储系统的性能和可靠性。通过引入Zoned Namespaces和多队列等新功能,NVMe 1.4将为各种应用场景提供更高效的存储解决方案,并为数据中心和服务器等高负载环境带来更好的性能和稳定性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百里杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值