RDMA技术详解(三):理解RDMA Scatter Gather List
1. 前言
在使用RDMA操作之前,我们需要了解一些RDMA API中的一些需要的值。其中在ibv_send_wr我们需要一个sg_list的数组,sg_list是用来存放ibv_sge元素,那么什么是SGL以及什么是sge呢?对于一个使用RDMA进行开发的程序员来说,我们需要了解这一系列细节。
2. SGE简介
在NVMe over PCIe中,I/O命令支持SGL(Scatter Gather List 分散聚合表)和PRP(Physical Region Page 物理(内存)区域页), 而管理命令只支持PRP;而在NVMe over Fabrics中,无论是管理命令还是I/O命令都只支持SGL。
RDMA编程中,SGL(Scatter/Gather List)是最基本的数据组织形式。 SGL是一个数组,该数组中的元素被称之为SGE(Scatter/Gather Element),每一个SGE就是一个Data Segment(数据段)。RDMA支持Scatter/Gather操作,具体来讲就是RDMA可以支持一个连续的Buffer空间,进行Scatter分散到多个目的主机的不连续的Buffer空间。Gather指的就是多个不连续的Buffer空间,可以Gather到目的主机的一段连续的Buffer空间。
下面我们就来看一下ibv_sge的定义:
struct ibv_sge {uint64_t addr;uint32_t length;uint32_t lkey;
};
- addr: 数据段所在的虚拟内存的起始地址 (Virtual Address of the Data Segment (i.e. Buffer))
- length: 数据段长度(Length of the Data Segment)
- lkey: 该数据段对应的L_Key (Key of the local Memory Region)
2. ivc_post_send接口
而在数据传输中,发送/接收使用的Verbs API为:
- ibv_post_send() - post a list of work requests (WRs) to a send queue 将一个WR列表放置到发送队列中
ibv_post_recv() - post a list of work requests (WRs) to a receive queue 将一个WR列表放置到接收队列中
下面以ibv_post_send()为例,说明SGL是如何被放置到RDMA硬件的线缆(Wire)上的。
ibv_post_send()的函数原型
#include <infiniband/verbs.h>int ibv_post_send(struct ibv_qp *qp, struct ibv_send_wr *wr,struct ibv_send_wr **bad_wr);
ibv_post_send()将以send_wr开头的工作请求(WR)的列表发布到Queue Pair的Send Queue。 它会在第一次失败时停止处理此列表中的WR(可以在发布请求时立即检测到),并通过bad_wr返回此失败的WR。
参数wr是一个ibv_send_wr结构,如<infiniband / verbs.h>中所定义。
3. ibv_send_wr结构
struct ibv_send_wr {uint64_t wr_id; /* User defined WR ID */struct ibv_send_wr *next; /* Pointer to next WR in list, NULL if last WR */struct ibv_sge *sg_list; /* Pointer to the s/g array */int num_sge; /* Size of the s/g array */enum ibv_wr_opcode opcode; /* Operation type */int send_flags; /* Flags of the WR properties */uint32_t imm_data; /* Immediate data (in network byte order) */union {struct {uint64_t remote_addr; /* Start address of remote memory buffer */uint32_t rkey; /* Key of the remote Memory Region */} rdma;struct {uint64_t remote_addr; /* Start address of remote memory buffer */uint64_t compare_add; /* Compare operand */uint64_t swap; /* Swap operand */uint32_t rkey; /* Key of the remote Memory Region */} atomic;struct {struct ibv_ah *ah; /* Address handle (AH) for the remote node address */uint32_t remote_qpn; /* QP number of the destination QP */uint32_t remote_qkey; /* Q_Key number of the destination QP */} ud;} wr;
};
在调用ibv_post_send()之前,必须填充好数据结构wr。 wr是一个链表,每一个结点包含了一个sg_list(i.e. SGL: 由一个或多个SGE构成的数组), sg_list的长度为num_sge。
4. RDMA 提交WR流程
下面图解一下SGL和WR链表的对应关系,并说明一个SGL (struct ibv_sge *sg_list)里包含的多个数据段是如何被RDMA硬件聚合成一个连续的数据段的。
4.1 第一步:创建SGL
从上图中,我们可以看到wr链表中的每一个结点都包含了一个SGL,SGL是一个数组,包含一个或多个SGE。通过ibv_post_send提交一个RDMA SEND 请求。这个WR请求中,包括一个sg_list的元素。它是一个SGE链表,SGE指向具体需要发送数据的Buffer。
4.2 第二步:使用PD进行内存保护
我们在发送一段内存地址的时候,我们需要将这段内存地址通过Memory Registration注册到RDMA中。也就是说注册到PD内存保护域当中。一个SGL至少被一个MR保护, 多个MR存在同一个PD中。如图所示一段内存MR可以保护多个SGE元素。
4.3 调用ibv_post_send()将SGL发送到wire上去
在上图中,一个SGL数组包含了3个SGE, 长度分别为N1, N2, N3字节。我们可以看到,这3个buffer并不连续,它们Scatter(分散)在内存中的各个地方。RDMA硬件读取到SGL后,进行Gather(聚合)操作,于是在RDMA硬件的Wire上看到的就是N3+N2+N1个连续的字节。换句话说,通过使用SGL, 我们可以把分散(Scatter)在内存中的多个数据段(不连续)交给RDMA硬件去聚合(Gather)成连续的数据段。
附录一: OFED Verbs
RDMA技术详解(三):理解RDMA Scatter Gather List相关推荐
- RDMA技术详解——DMA和RDMA概念
1.1 DMA DMA(Direct Memory Access,直接内存访问)是一种能力,允许在计算机主板上的设备直接把数据发送到内存中去,数据搬运不需要CPU的参与.如下图所示 红线部分为传统内存 ...
- 【RDMA】RDMA技术详解(二):Send Receive操作
原文:https://blog.csdn.net/qq_21125183/article/details/86525012 英文:https://zcopy.wordpress.com/2010/10 ...
- DMA RDMA 技术详解
DMA 技术是一个 直接内存访问技术. 在传统的linux 内存读写操作都必须经过cpu,读写寻址都是有cpu 完成的, 现在有一中技术 让数据读写完全由网卡自己完成. 这样就必须有硬件支持,及系统必 ...
- RDMA技术详解——RDMA常见概念
Fabric A local-area RDMA network is usually referred to as a fabric. 所谓Fabric,就是支持RDMA的局域网(LAN). CA( ...
- P2P技术详解(三):P2P技术之STUN、TURN、ICE详解
本文是<P2P理论详解>系列文章中的第2篇,总目录如下: <P2P技术详解(一):NAT详解--详细原理.P2P简介> <P2P技术详解(二):P2P中的NAT穿越(打洞 ...
- RDMA技术详解——原理和三种实现方式
RDMA作为一种host-offload, host-bypass技术,使低延迟.高带宽的直接的内存到内存的数据通信成为了可能.目前支持RDMA的网络协议有: 1.InfiniBand(IB): 从一 ...
- RDMA技术详解(一):RDMA概述
1. DMA和RDMA概念 1.1 DMA DMA(直接内存访问)是一种能力,允许在计算机主板上的设备直接把数据发送到内存中去,数据搬运不需要CPU的参与. 传统内存访问需要通过CPU进行数据copy ...
- RDMA技术详解——RDMA核心概念
1.1 Memory Registration(MR) | 内存注册 RDMA 就是用来对内存进行数据传输.那么怎样才能对内存进行传输,很简单,注册. 因为RDMA硬件对用来做数据传输的内存是有特殊要 ...
- P2P技术详解(三):P2P技术之STUN、TURN、ICE详解 (webrtc)
https://www.cnblogs.com/mlgjb/p/8243690.html 简单的说,TURN与STURN的共同点都是通过修改应用层中的私网地址达到NAT穿透的效果,异同点是TURN是通 ...
最新文章
- 零门槛!手把手教你打造AI应用
- 欢迎给图灵教育微信平台投食
- 教你用机器学习匹配导师 !(附代码)
- 2017年度NLP领域论文TOP10(附链接)
- mysql主从切换gtid不一致_GTID 复制、主从不一致跳过操作、快速切换master
- Java判断一组数字是否是等差数列
- keil 在项目栏总有个叉_老股民的热心分享:均线金叉死叉买卖定式”,散户值得一看!...
- 播放RTMP协议的流媒体的几种选择
- 列表导航栏实例(04)——精美模板赏析
- 6、oracle数据库下查询操作
- 『JavaScript』利用Javascript获取IP地址内容方法
- python 图像分析 边框_Python 去除图片纯色边框(qbit)
- jedis开发过程中遇到的问题及其解决方法
- 18th, Oct 端正心态,积蓄实力,等待爆发的一刻
- 关于VS编译的程序内存分配只能用1.5~2G上限的优化方案
- pytorch(6)--深度置信网络
- 新手电脑硬件软件故障解答(二)
- openwrt路由器打印机服务器设置_openwrt 路由器下HP 打印机的安装
- 腾讯优图实验室招聘计算机视觉研究员和实习生
- 可迁移注意力攻击(TAA)
热门文章
- 教你如何成为数据科学家(六)
- 用Anko和Kotlin实现Android上的对话框和警告提示(KAD 24)
- 终于写了自己第一个有些用处的代码,留念留念,是模糊搜索并复制到指定文件夹...
- HDU 5727 Necklace
- Linux服务器程序编程的几个坎
- 疫情期间在公共场所要全程佩戴口罩,不要抱有侥幸心理
- Python语言编程之LEGB变量作用域法则
- 同样是程序员,优秀的程序员能够月入5万甚至50万!,一般的程序员却只能月入5千甚至更低?那么他们差别在哪里呢?
- 网络和计算机管理制度,网络和计算机使用管理制度
- 双模sa_2020年5G终端发展展望:NSA/SA双模终端将成市场“主力军”!