首页 > 其他分享 >NVMe over RoCE

NVMe over RoCE

时间:2024-01-24 22:00:13浏览次数:20  
标签:NVMe Controller RDMA 内存 RoCE over

1. 概览
网络从协议的角度上来说,分为
应用层(http)
传输层(tcp/udp)
网络层(ip,路由,拥塞)
数据链路层(mac,以太网,交换机)
物理层

NVMe over RoCE, 全称:Non-Volatile Memory Express over RDMA over Converged Ethernet
RoCE通过以太网来传播,基于ipv4/v6,FCoE(以太网光纤通道)等。工作在传输层。
PCIe, 全称:Peripheral Component Interconnector Express

RoCE v2基于UDP/IPv4和UDP/IPv6开发,提供保序和拥塞控制。

RDMA和RoCE之间的关系
RoCE是一种4层网络协议,基于IP/UDP来传输数据。
RDMA是一种用户态内存拷贝技术,对标取代内核TCP协议栈中存在的多次内存。
RDMA可以通过RoCE, InfiniBand, iWARP等协议在网络上传输。

上层App通过调用指定的api库,使用RDMA。
同时网卡要支持RDMA。

2. 基本流程
RDMA的工作原理:

  1. 和目标端建立连接,初始化channel链接。每个channel由一对Queue Pairs组成,
    每对儿QP由SendQueue和ReceiveQueue构成。同时提供CompleteQueue, 用于通知消息完成。
  2. 创建并初始化QP, 同时和对端交换QP信息。
  3. 注册内存给网卡,网卡返回访问内存的key。
  4. 用户创建并提交请求(WR)到工作队列中(WQ)。网卡异步处理请求,完成请求以后把通知放到CQ中。

RDMA具体请求原理:

  1. send/recv
    双边操作,发送端和接收端注册自己的工作情况,实现数据的发送、接收和处理。
  2. 读 pull
    源端通知目标端准备虚拟内存地址和内存key,源端再注册自己的内存进去,执行read操作。
  3. 写 push
    源端通知目标端准备虚拟内存地址和内存key,源端再注册自己的内存进去,执行write操作。

3. 相关代码和资料
编程资料
基于RDMA写的client和server: https://github.com/tarickb/the-geek-in-the-corner/tree/master
IBM的官方库文档:https://www.ibm.com/docs/en/aix/7.1?topic=ofed-verbs-api
github上的库文件:https://github.com/linux-rdma/rdma-core

深入网络相关:https://zhuanlan.zhihu.com/p/551845192
短中期内需要学习的书籍:
尹圣雨的《TCP/IP 网络编程》
游双《Linux高性能服务器编程》 (带有实践)
《TCP/IP 协议详解》(卷一/二,中长期必看)

附:
nvme协议相关:
NVMe是一套基于PCI总线的,访问非易失性存储介质的总线规范,对标SAS和SATA。
NVMe over Fabrics是一套远程访问NVMe设备的协议,传输层可以基于RoCE/FC/InfiniBand等系统。
NVMe比传统协议更快的原因是通道多(支持最多64000个通道,每个通道64000条commond)
NVMe协议:https://nvmexpress.org/specifications/
一些基本概念: NVMe把存储设备看做是Domain-EnduranceGroup-NVMSet-Namespace 这一系列的树状结构
同时用户通过Controller来控制这些存储设备。
Controller可以通过灵活的方式,多用户多Controller,单用户多Controller,单用户单Controller,多用户单Controller等等。
Controller控制的最小单位是Namespace,也是非常灵活。Namespace是实际的物理单位,通过匹配多个NSID,可以实现和上层Controller的解耦。
Controller分为三种类型,I/O Controller, Administration Controller, Discovery Controller

标签:NVMe,Controller,RDMA,内存,RoCE,over
From: https://www.cnblogs.com/kiman/p/17985956

相关文章

  • Understanding the linux kernel Chapter3 Processes
    ProcessDescriptorHowProcessesAreOrganizedtheprocessinstate:TASK_RUNNINGorganizedinrunqueuelistgroupTASK_STROPPED\EXIT_ZOMBIE\EXIT_DEADThereisnoneedtogroupprocessesinanyofthesethreestates,becausestopped,zombie,andd......
  • Qt开发程序用QProcess调用curl命令上传文件并获取响应的文件
    1.需求做一个批量数字签名的工具,从一个文件夹内寻找所有的exe文件,然后复制到另外一个文件夹中,并且保存源文件的路径,将目标文件夹内的所有exe文件上传到公司的数字签名平台去做数字签名,并且返回接收后的文件;尝试了libcurl的post请求,发现总是返回参数错误; intHttpClient::Po......
  • element upload avator hover 有遮罩层 删除和预览按钮 选项
    hover:<divclass="upload"><el-uploadclass="avatar-uploader":on-success="handleAvatarSuccess"><imgv-if="ruleForm.imageUrl":src="ruleForm.image......
  • 不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认
    今天运行项目的时候出现了这个错误....查了一下解决的方法。具体方案如下: 1、先确认安装IIS的时候有没有装Asp.Net,如果没安装的话,安装上即可。(XTHS:采用这步,就可以了!) 2、IIS采用了更安全的web.config管理机制,默认情况下会锁住配置项不允许更改。用超级管理员的身份执......
  • 神经网络优化篇:详解调试处理(Tuning process)
    调试处理关于训练深度最难的事情之一是要处理的参数的数量,从学习速率\(a\)到Momentum(动量梯度下降法)的参数\(\beta\)。如果使用Momentum或Adam优化算法的参数,\(\beta_{1}\),\({\beta}_{2}\)和\(\varepsilon\),也许还得选择层数,也许还得选择不同层中隐藏单元的数量,也许还想使用学习......
  • inode爆满error is not recoverable exiting now
      查看    ......
  • python 多线程multiprocessing
    该多线程,简单计算结果可以使用,在django里想并行处理多个实体进行计算不行,请自行验证importmultiprocessing#要在进程池中并行执行的任务函数defprocess_data(data):#执行任务的逻辑result=data*2returnresultif__name__=='__main__':#创......
  • text-overflow:ellipsis 设置超出省略号不管用的原因可能是哪些
    text-overflow:ellipsis设置超出省略号不管用的原因可能是哪些text-overflow:ellipsis设置超出文本内容显示省略号(…)可能不管用的原因有以下几点:容器宽度没有限制:text-overflow:ellipsis与overflow:hidden配合使用时,需要确保文本容器具有固定的宽度,并且该宽度不足以......
  • Feign源码解析6:如何集成discoveryClient获取服务列表
    背景我们上一篇介绍了feign调用的整体流程,在@FeignClient没有写死url的情况下,就会生成一个支持客户端负载均衡的LoadBalancerClient。这个LoadBalancerClient可以根据服务名,去获取服务对应的实例列表,然后再用一些客户端负载均衡算法,从这堆实例列表中选择一个实例,再进行http调用即......
  • Process Explorer高级技巧
    ProcessExplorer是一款功能丰富的进程系统工具,远比windows自带的任务管理器强大。  还原线程堆栈 点击菜单Options--ConfigureSymbols... 配置Symbol符号表:srv*D:\Symbols\sys*http://msdl.microsoft.com/download/symbols;D:\Symbols\MyGame然后把MyTest1-Win6......