深入理解SPDK NVMe/TCP transport的设计

一. 简介

NVMe/TCP transport是NVM express这个标准组织为NVMe over Fabrics(NVMe-oF) 制定的一个基于TCP的新的传输层。这个Technical proposal (TP 8000)自去年11月份发布以来,相应的代码在内核态(Linux kernel)和用户态(SPDK库)中均有了支持。

二. SPDK NVMe/TCP

代码解析

总的来讲,SPDK NVMe/TCP transport的整个设计遵循了SPDK无锁,轮询,异步I/O的理念,如Table1所示。根据TP8000 specification中的定义,每个TCP连接(TCP connection)对应于一个NVMe的qpair。在SPDK的实现中,我们依然采用group polling的方法来管理所有的TCP连接。每一个SPDK thread上运行一个TCP相关的polling group,每一个TCP连接只会被加入一个TCP polling group中,由这个polling group处理后续的所有事件,那么这个TCP连接将会被唯一的CPU core处理,这样就不会存在CPU的竞争情况:不同CPU竞争处理同一个TCP connection。这样的设计在很大的层面上避免了CPU资源的竞争。另外目前存在很多用户态的TCP协议栈,为此SPDK封装了一些socket API相关的操作。目前,NVMe/TCP的实现代码直接使用SPDK封装的API进行socket的操作,如此一来,我们可以接入不同种类的Socket API实现,诸如VPP,mTCP,fstack,seastar等。只要能够实现SPDK socket API所定义的抽象函数,就可以整合到SPDK的sock库中。

Table 1 SPDK NVMe/TCP transport设计理念

NVMe-oF transport(传输层)的抽象

SPDK定义的NVMe-oF的框架剥离出了NVMe或者NVMe-oF处理逻辑的共同代码,然后针对所有的transport提供了一个统一的抽象接口。那么每个transport只需要实现这个接口里面的函数或者数据结构即可。对于TCP transport也是一样,target端和host端完全遵循这个设计。Figure1给出了目前SPDK软件库实现的或者将要实现的transport。其中Fibre Channel的支持的patch还在review 过程中,TCP transport和VPP的stack可以整合,但是由于VPP stack的一些稳定性原因,所以也标记为“在整合过程中”。

Figure 1 SPDK NVMe-oF对各个transport的支持

另外Table2 给出了SPDK在target 和host端对transport支持的源文件的一些路径。

Table 2 SPDK对transport支持的一些文件路径

NVMe/TCP transport的信息管理

在target端的TCP传输层主要对以下信息进行了管理:

  • Portals: 可以定义为<IP address, port>,每个NVMe 子系统都可以监听几个不同的Portal。另外每个portal可以被不同的NVM subsystem共享。所有的Portal可以被TCP传输层的数据结构(struct spdk_nvmf_tcp_transport)进行统一管理。另外每个Portal都有一个引用计数,用于统计多少NVM subsystem在共享这个portal。例如,如果<127.0.0.1, 4420>被三个子系统使用,那么引用计数是3。 在对这个portal销毁的时候,只有所有3个NVM subsystem被销毁,这个Portal才会被删除。
  • 共享数据池(Data buffer Pool): NVMe/TCP transport的读/写命令,都需要分配相应的buffer,然后进行后续的读写。当每个NVMe读/写命令(包含在NVMe/TCP transport的Command Capsule PDU中)被正确解析后,我们就会在共享数据池中分配所需要的data buffer。使用共享数据缓冲池的目的是为了控制内存使用的footprint。如果所需要的内存根据每个qpair的深度(Queue depth),那么所需要的内存大小将随着qpair的增加而线性增加, 这样对于支持大量TCP 连接而言是巨大的内存消耗。在SPDK的设计中,数据缓冲池由每一个CPU core上的TCP polling group共享,那么这些polling group之间必然会存在对这个共享池的数据竞争。为了很好的缓解这个数据竞争的问题,我们采用以下策略,即每个polling group在这个共享池中预先保留了一些data buffer,这些data buffer组成了一个buffer cache。那么这将保证每个TCP polling group 都有内存可以分配,杜绝了starvation(饥饿)的产生。因为在buffer cache中分配的数据buffer在使用完毕以后,依然会被回收到相应的polling group对应的buffer cache中。
  • TCP polling group中的socket管理: 首先SPDK对Socket套接字的API进行封装,这样我们既可使用内核态的TCP/IP栈的所对应的Posix API,也可以利用用户态的API(诸如VPP,用户也可以根据SPDK 对于socket API的抽象定义,整合其他用户态协议栈)。所以我们使用的函数是以spdk_sock_为前缀的函数。 例如,我们正常使用“listen”函数来监听端口,在SPDK 里面使用spdk_sock_listen,SPDK的TCP polling group(数据结构是struct spdk_nvmf_tcp_poll_group)中有个sock_group的指针。这个sock_group会在TCP polling group创建的时候被同时创建,这个sock_group用于管理所有映射到这个TCP polling group的所有TCP连接的socket。当一个TCP scoket连接被建立的时候,一定会被加入某个TCP polling group(目前使用的是Round Robin的算法),那么这个TCP的socket同时会被加入到这个TCP polling group的sock_group 中。

一个socket在socket polling group的周期,可以分为以下三类:

1)加入某个socket polling group 我们可以在Linux 系统中可以使用epoll相关的操作(例如,epoll create创建一个event相关的fd),然后通过epoll_ctl将socket信息(实际是fd,file descriptor)绑定到一个这个由epoll 创建的event fd中。

2)在polling group 被轮询 然后我们就可以利用epoll来检查每个其中的socket是否有EPOLLIN的事件(来自远程的数据);如果有相应的数据监测到,将会读取数据进行后续处理(实际上是调用spdk_nvmf_tcp_sock_cb这个回调函数)。

3)在socket polling group被删除 另外在轮询过程中,监测到TCP 断开时,我们会将这个socket从这个polling group中删除(比如在Linux系统中是调用epoll_ctl在event fd中解绑那个socket的fd信息),那么这个socket将不会被处理。

NVMe/TCP PDU的生命周期管理

无论在target还是host 端,SPDK 都采用了同样的状态机对一个PDU的生命周期进行管理(如图2所示),其中SPDK定义了5个状态:

  • Ready: 等待处理新的PDU。
  • Handle CH: TCP 连接收到数据,收到8个bytes后,判断PDU的类型,进行一系列的检查。如果错误,则进入到错误状态(Error State); 否则进入到下一个状态(Handle PSH)
  • Handle PSH: 这个状态用于处理PDU的specific header。如果处理出错,则进入错误状态(Error State),否则要么要么进入ready状态等待处理新的PDU,要么进入处理payload的状态(Handle payload)
  • Handle payload: 是主要用于处理PDU中包含的数据。而这些PDU只可能是CapsuleCmd,C2HDATA,H2CDATA,H2CTermReq,C2HTermReq。处理结束以后,要么进入ready状态要么进入错误状态(Error State)。
  • Error State: 如果这个TCP 连接 在接收 PDU的时候处于错误状态(Error State),那么这个TCP 连接会给对端发送TermREQ命令,意味着这个TCP 连接在不久将要被关闭。

Figure 2 NVMe/TCP PDU生命周期管理

Target端NVMe/TCP request的生命周期管理

在target端我们对nvme tcp request(struct spdk_nvmf_tcp_request) 定义了10个状态(如Figure3 所示),Figure4 给出了相应的状态转化图,清晰的描述了一个NVMe/TCP request的生命周期。这和目前SPDK 主分支里面的代码是完全一致的。

Figure 3 Target端NVMe Request的状态

Figure 4 NVMe TCP/Request的生命周期管理

学习地址:http://ke.qq.com/course/5066203?flowToken=1043717

更多DPDK学习资料有需要的可以自行添加进入学习交流君 羊 793599096 免费获取,或自行报名学习,免费订阅,永久学习,关注我持续更新哦!!!

原文链接:https://blog.csdn.net/weixin_37097605/article/details/101514681

lingshengxiyou
关注 关注
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SPDK v22.09 完整源码 SSD NVMe/性能测试
04-05
SPDK v22.09 完整源码,包括了所有子模块的代码。下载即可直接编译使用。 SPDK是一款开源软件,通常可用于SSD NVMe...它也支持用户对它进行二次开发,可基于SPDK设计自己的测试框架,基于SPDK编写测试用例也非常简单。
剖析SPDK读写NVMe盘过程--从hello_world开始
weixin_37097605的博客
11-30 3305
1概述本文基于SPDK v22.09(点击蓝字,阅读往期文章),从hello_world程序来剖析SDPK NVMe用户态驱动,对NVMe盘的初始化、管理和读写操作。spdk/examples/nvme/hello_world.c整体结构代码:图1显示了NVMe子系统和CPU以及内存设备之间的结构,这对于我们理解spdk[MX1]的IO过程很有帮助。Qpair一般创建于内存中,nvme子系统作为...
深入理解 SPDK NVMe/TCP transport设计
weixin_37097605的博客
06-26 2166
作者简介:杨子夜,Intel 存储软件开发工程师,主要从事SPDK软件开发工作。01简 介NVMe/TCP transportNVM express这个标准组织为NVM...
SPDK绑定nvme磁盘失败报错
最新发布
一名运维开发工程师的日常记录
09-10 225
如下在spdk 接管设备时,报错Active devices: data@nvme0n1, so not binding PCI dev。于是查看磁盘信息, 原因是曾经被我格式化过了。此时需要使用dd 将文件系统信息擦除。
利用SPDK改善NVMe存储I/O性能
大隐隐于野
11-07 668
向后通过对块设备的抽象可以适配各类型的存储设备。为了减少存储产品面临的传统共性问题,如频繁的系统调用和上下文切换、多次的数据拷贝、过高的协议栈开销、复杂的并发互斥等痛点问题,在用户态化实现的过程中,引入了 Intel 的 DPDK/SPDK作为关键基础技术来进行集成和开发。当前的实现中,一方面,增加了对请求所属的监听是否当前 subsystem 所允许的合法性判断,同时也对同一个主机,通过同一个 port(主机侧的 port 和 Target 侧的监听均一样)来进行重复建链(建立控制链接)的情况的限制。
nvme、spdk、dpdk、rdma
探索未知,成就非凡
07-03 721
NVMe、DPDK和RDMA的结合:当结合NVMe、DPDK和RDMA时,可以构建出一种高性能的存储和网络解决方案。NVMe、SPDK和RDMA的结合:当结合NVMe、SPDK和RDMA时,可以构建出一种高性能的存储解决方案。通过利用SPDKNVMe驱动和RDMA支持,可以实现高速的NVMe存储设备之间的直接数据传输,同时减少主机之间的通信开销和延迟。通过结合SPDKNVMe驱动和RDMA支持,可以实现高性能、低延迟的NVMe设备之间的直接数据传输。
NVMe over TCP性能测试和调优方法
weixin_37097605的博客
01-11 1757
SPDK基于NVMeover Fabrics协议[1],实现了NVMe协议在TCP、RDMA等传输通道上的拓展,使得块设备可以通过TCP或RDMA暴露出来。基于TCPNVMe over TCP的数据传输框架如图1所示:图1. Nvme over TCP数据传输框架1. NVMe over TCP数据传输原理和机制我们以NVMeover TCP读取数据为例进行数据传输机制的分析。与一般的服务器...
全能USB3.x/Nvme/Other驱动注入工具 v6.6 绿色免费版
07-12
全能USB3.x/Nvme/Other驱动注入工具是一款无需安装就可以直接使用的驱动注入工具,这款功能可以帮你一键识别USB3.0设备,软件非常实用方便,有需要的用户赶快来下载使用吧!安装驱动平台:Windows7或以上系统功能:1...
基于NVMe与TCP的超高性能存储解决方案.pdf
10-13
1. NVMe/TCP技术:NVMe over TCP是一种新兴的存储通信协议,它允许通过标准的TCP/IP网络传输NVMe命令,使存储设备能够像本地设备那样进行高速和低延迟的数据访问。 2. 云原生应用的存储需求:云原生应用如NoSQL...
基于NVMe与TCP的超高性能存储解决方案.pptx
10-13
基于NVMe与TCP的超高性能存储解决方案.pptx
bios刷新辅助工具(内含MMTool-5.07工具以及Nvme模块)
09-10
Nvme(非易失性内存主机控制器接口规范)是一种高速接口标准,专为固态硬盘(SSD)设计,特别是使用PCIe接口的SSD。Nvme模块在BIOS中起到关键作用,因为它允许操作系统直接与SSD通信,大大提高了数据传输速度和系统...
NVMe over TCP高性能文件存储,让未来照进现实,400us
大隐隐于野
01-12 713
闪存是一种固态芯片,主流的闪存设备使用NAND技术来映射数据,这种芯片无需任何外部电源即可维护存储的数据,它的读写速度比内存稍低,但无需借助机械方式进行寻址,因此读写性能远高于机械磁盘,容量也比内存要大,单GB成本近年来快速下降,大有成为服务器上高速存储介质主流设备的趋势。,与SCSI等协议不同,NVMe协议实现了多队列的架构和指令集,更能发挥多核CPU服务器的处理能力,使该协议指令集在多核CPU服务器上发挥更好的性能,存储系统如果不能针对这些特点进行深入的优化,也不能充分享受到新型介质和协议带来的红利。
NVMe VPP(Virtual Pin Port)解码
zdx19880830的专栏
05-04 6426
IceLake CPU通过SMBus总线传递用于热拔插PCIE管理的VPP(Virtual Pin Port)。VPP信息用于PCI SSD Enclosure管理,每个PCIe SSD占用8bits. 下图是单个SSD的位定义: Bit 方向 PCIE信号名 FPGA信号名 0 输出 ATNLED FAULT 1 输出 PWRLED LOCATE 2 输出 PWREN_N...
TCP粘包、拆包与解决方案、C++ 实现
houxian1103的博客
01-10 7794
说明: TCPtransport control protocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样,接收端,就难于分辨出来了,必须提供科学的拆包机制。即面向流的通信是无消息保护边界的。 TCP粘包、拆包图解 假设客户端分别发送了两个数据包D1和D2给服务端,由
分析spdk nvmf配置流程和相关接口,对比HWSAN相关功能,分析overtcp和overfc的配置
Yttsam的博客
04-25 700
SPDK(Storage Performance Development Kit)是一个用于存储应用程序开发的开源工具包。SPDK提供了一个专注于数据存储的 I/O 框架,并且能够通过将应用程序的逻辑处理与核心数据路径分开来提供低延迟,高吞吐量的存储传输。下面我将分别回答您的问题。
ActiveMQ系列之五:ActiveMQ的Transport
weixin_30514745的博客
11-30 237
连接到ActiveMQ Connector:ActiveMQ提供的,用来实现连接通讯的功能。包括:client-to-broker、broker-to-broker。ActiveMQ允许客户端使用多种协议来连接配置TransportConnector,在conf/activemq.xml里面,大致如下:<transportConnectors> <trans...
SPDK NVMe之hello world
Phoenix_zxk的博客
09-03 415
SPDK NVMe之hello world
NVMe over TCP 香吗?
m0_69056972的博客
05-09 1185
NVM Express(NVMe)全称是non-volatile memory express 或称非易失性内存主机控制器接口规范,是专门为NAND、闪存等非易失性存储设计的。
NVMe over TCP环境搭建和卸载
gwf216的博客
06-24 1491
本文讲述了如何在两个femu间搭建NVMe over TCP环境。
写文章

热门文章

  • DNS用的是TCP协议还是UDP协议 11795
  • DNS递归查询与迭代查询 11037
  • C++:Boost库 8290
  • nginx 负载均衡 8044
  • VMWare虚拟机网络配置 6489

分类专栏

  • c++ 374篇
  • linux 372篇
  • DPDK 345篇
  • java 4篇
  • KVM 2篇

最新评论

  • OVS DPDK VXLAN隧道处理

    衣露申844: https://segmentfault.com/a/1190000020337904

  • [docker 网络] ovs-docker 使用及原理

    水中加点糖: 《[docker 网络] ovs-docker 使用及原理》原文链接:https://www.jianshu.com/p/0237e9fec8ea

  • QEMU中断设备模拟

    weixin_36009661: 这是原创?还收费?时间都比人家晚一年了快

  • DPDK KNI原理和实现

    coolfishbone_joey: mark: 用户态buff和内核交互, 中间桥梁是物理地址PA, 然后用户户态是用的VA, 内核态用的kva. 这样就实现了用户态和内核 态的交互.

  • Docker 网络模型之 macvlan 详解,图解

    qq_43528228: 请问为什么容器的网络模式为macvlan,但却无法连接外网?

最新文章

  • ARP协议
  • 在DOCKER DESKTOP 底下搭建K8S 环境搭建
  • k8s集群环境搭建
2023年267篇
2022年472篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

玻璃钢生产厂家北京玻璃钢雕塑卡通住宅小区玻璃钢室外雕塑主题商场美陈怎么样安徽抽象玻璃钢雕塑定制学校玻璃钢仿铜雕塑定制商场主题创意商业美陈创作玻璃钢景观雕塑费用深圳玻璃钢雕塑卡通长春玻璃钢花盆图片价格苏州商场装饰美陈岳阳商场美陈花器家用玻璃钢雕塑摆件江苏公园玻璃钢雕塑哪家便宜江苏公园玻璃钢雕塑市场价格玻璃钢发光雕塑粽子图片商场主题美陈从前期设计到落地商场店庆美陈布置稿件商场森系美陈淮北公园玻璃钢雕塑优势浙江超市商场美陈价格龙泉玻璃钢雕塑哪家好北票玻璃钢仿铜人物雕塑浙江开业商场美陈供货商滕州玻璃钢大象雕塑玻璃钢楼盘景观雕塑供应商五家渠玻璃钢雕塑造型湖州户内玻璃钢雕塑衢州户外玻璃钢雕塑哪家便宜动漫玻璃钢雕塑制作吉林卡通玻璃钢动物鹿雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化