NVMe over Fabrics:概念、应用和实现

2023-12-30 16:04

本文主要是介绍NVMe over Fabrics:概念、应用和实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对于大部分人来说,NVMe over Fabrics(简称NVMf)还是个新东西,因为其第一个正式版本的协议在今年6月份才发布。但是这并不影响人们对NVMf的关注,因为这项依托于NVMe的技术很可能继续改变存储市场格局。

NVMf的贡献在于提供除PCIe外访问NVM的另一个途径-Fabrics,并且将fabrics链路在latency上增加的overhead维持在10us以内。来自NVMf spec的一张图清晰的展示了它的野心,围绕着NVMe的战场再一次扩大了。

提供fabrics途径后,可以在其他节点直接访问NVMe设备,那么最基本的应用就是替代传统的iSCSI,在闪存系统中导出NVMe。

NVMf以NVMe为基石,适配Fabrics场景,新增或删减了的一些Command、概念。

1,Host,Target和Transport

client端称作Host,处理client请求的部分称作Target端(连接物理NVMe设备),Host和Target之间使用NVMe命令交流。Transport是连接Host和Target的桥梁,可以是RDMA或者FC。在Fabrics传输过程中,NVMe命令会被相应的Transport代码封装(Capsule)和解析。

2,NVMe Subsystem,NVMe Namespace和Port

一个Subsystem就是一个NVMe子系统,Subsystem在target端,Host可以申请连接某个target的Subsystem。一个Port代表一个Transport资源。Subsystem必须和Namespace,Port建立关系,但是他们的联系又是很灵活的:即一个Subsystem可以包含多个Namespace,一个Namespace可以加入多个Subsystem,一个Port可以放入多个Subsystem。如下可以将一个NVMe Namespace放入两个Subsystem中形成Fabric多路径配置。

3,NVMe Subsystem中的NVMe Controller

在NVMe Subsystem中,NVMe Controller是一个虚拟的概念,但是具有NVMe协议规定的属性(如部分NVMe寄存器,NVMe Queue和处理NVMe Command)。当一个host接入Subsystem后,就会创建一个Controller对象。那么如何处理NVMe寄存器的访问呢?这就要涉及到NVMf定义的几个Command。

4,NVMf新增和删减Command

在NVMf下,Host和Target之间的传输舍弃了Doorbell的设计,删除了NVMe Queue Create等Admin Command。NVMe Queue的创建在构建Controller后就已经完成了。

NVMf协议新增加的Command如下图,其中Property用来访问NVMe Controller寄存器(仅限于有限的几个寄存器,如Controller Configuration),Connect用来连接Host与Controller的NVMe Queue,Authentication则用于权限管理。

5,NVMe Command的传输方式

Host和Target间的NVMe命令可以在Transport封装时将I/O 数据置于NVMe Command(64Bytes)之后,或者使用SGL表示。如果是前者,则target直接从offset处读取数据,如果是后者,则需要通过RDMA read获取数据(Transport为RDMA的情况下)。虽然声称使用SGL,但是无论是SPDK还是Kernel 实现的Target在提交给物理设备的时候都会转换成PRP,所以目前的NVMe SSD还无需担心由于无法处理SGL请求导致的问题。

NVMf的推广很大程度上要依赖于其代码的实现,好在从Linux Kernel 4.8开始就被收纳,目前只有RDMA一种Fabric Transport。接下来我们看看内核态NVMf的代码框架。

Host端,主要是Host端代码和非NVMf模式下Local NVMe的处理。不管是Host端,还是Local的请求都会经过Linux blk-mq再下发到物理NVMe设备。当然,在经过Fabrics前,I/O请求会先被封装成NVMe Command格式。

Target端,实现了两种Transport(Loopback和RDMA),用户设置通过configfs进行。在收到Host端的I/O请求后,Target也是经过blk-mq下发到物理设备(其实是通过submit_bio向Host端的Local NVMe代码发起请求,类似于文件系统的方式)。

SPDK也加入了NVMf阵营,实现了Target端的代码。由于SPDK天然的优势,Target端的I/O请求可以直接发给物理Controller(Direct模式下),并且按照NVMf的规定将物理Controller作为NVMf独占,在I/O路径和框架上看起来更简洁。

不过,值得一提的是,无论是SPDK还是内核NVMf,从Host端过来的NVMe Command都要被Target代码解析成普通的I/O Request发给PCIe NVMe代码处理,所以NVMf下无论是NVMe Queue还是NVMe Command都是相对于Subsystem和host之间而言。

参考资料

1, NVM Express over Fabrics Revision 1.0 spec

2, NVM Express Over Fabrics by Dave Minturn,Intel undle Openfabrics Alliance

3, Under the Hood with NVMe over Fabrics by Dave Minturn,Intel at SNIA forum

4, NVM Express Device Drivers by Uma M.Parepalli at FlashMemroy Summit

这篇关于NVMe over Fabrics:概念、应用和实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/553351

相关文章

AJAX请求上传下载进度监控实现方式

《AJAX请求上传下载进度监控实现方式》在日常Web开发中,AJAX(AsynchronousJavaScriptandXML)被广泛用于异步请求数据,而无需刷新整个页面,:本文主要介绍AJAX请... 目录1. 前言2. 基于XMLHttpRequest的进度监控2.1 基础版文件上传监控2.2 增强版多

Redis分片集群的实现

《Redis分片集群的实现》Redis分片集群是一种将Redis数据库分散到多个节点上的方式,以提供更高的性能和可伸缩性,本文主要介绍了Redis分片集群的实现,具有一定的参考价值,感兴趣的可以了解一... 目录1. Redis Cluster的核心概念哈希槽(Hash Slots)主从复制与故障转移2.

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整