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相关推荐

  1. RDMA技术详解——DMA和RDMA概念

    1.1 DMA DMA(Direct Memory Access,直接内存访问)是一种能力,允许在计算机主板上的设备直接把数据发送到内存中去,数据搬运不需要CPU的参与.如下图所示 红线部分为传统内存 ...

  2. 【RDMA】RDMA技术详解(二):Send Receive操作

    原文:https://blog.csdn.net/qq_21125183/article/details/86525012 英文:https://zcopy.wordpress.com/2010/10 ...

  3. DMA RDMA 技术详解

    DMA 技术是一个 直接内存访问技术. 在传统的linux 内存读写操作都必须经过cpu,读写寻址都是有cpu 完成的, 现在有一中技术 让数据读写完全由网卡自己完成. 这样就必须有硬件支持,及系统必 ...

  4. RDMA技术详解——RDMA常见概念

    Fabric A local-area RDMA network is usually referred to as a fabric. 所谓Fabric,就是支持RDMA的局域网(LAN). CA( ...

  5. P2P技术详解(三):P2P技术之STUN、TURN、ICE详解

    本文是<P2P理论详解>系列文章中的第2篇,总目录如下: <P2P技术详解(一):NAT详解--详细原理.P2P简介> <P2P技术详解(二):P2P中的NAT穿越(打洞 ...

  6. RDMA技术详解——原理和三种实现方式

    RDMA作为一种host-offload, host-bypass技术,使低延迟.高带宽的直接的内存到内存的数据通信成为了可能.目前支持RDMA的网络协议有: 1.InfiniBand(IB): 从一 ...

  7. RDMA技术详解(一):RDMA概述

    1. DMA和RDMA概念 1.1 DMA DMA(直接内存访问)是一种能力,允许在计算机主板上的设备直接把数据发送到内存中去,数据搬运不需要CPU的参与. 传统内存访问需要通过CPU进行数据copy ...

  8. RDMA技术详解——RDMA核心概念

    1.1 Memory Registration(MR) | 内存注册 RDMA 就是用来对内存进行数据传输.那么怎样才能对内存进行传输,很简单,注册. 因为RDMA硬件对用来做数据传输的内存是有特殊要 ...

  9. P2P技术详解(三):P2P技术之STUN、TURN、ICE详解 (webrtc)

    https://www.cnblogs.com/mlgjb/p/8243690.html 简单的说,TURN与STURN的共同点都是通过修改应用层中的私网地址达到NAT穿透的效果,异同点是TURN是通 ...

最新文章

  1. 零门槛!手把手教你打造AI应用
  2. 欢迎给图灵教育微信平台投食
  3. 教你用机器学习匹配导师 !(附代码)
  4. 2017年度NLP领域论文TOP10(附链接)
  5. mysql主从切换gtid不一致_GTID 复制、主从不一致跳过操作、快速切换master
  6. Java判断一组数字是否是等差数列
  7. keil 在项目栏总有个叉_老股民的热心分享:均线金叉死叉买卖定式”,散户值得一看!...
  8. 播放RTMP协议的流媒体的几种选择
  9. 列表导航栏实例(04)——精美模板赏析
  10. 6、oracle数据库下查询操作
  11. 『JavaScript』利用Javascript获取IP地址内容方法
  12. python 图像分析 边框_Python 去除图片纯色边框(qbit)
  13. jedis开发过程中遇到的问题及其解决方法
  14. 18th, Oct 端正心态,积蓄实力,等待爆发的一刻
  15. 关于VS编译的程序内存分配只能用1.5~2G上限的优化方案
  16. pytorch(6)--深度置信网络
  17. 新手电脑硬件软件故障解答(二)
  18. openwrt路由器打印机服务器设置_openwrt 路由器下HP 打印机的安装
  19. 腾讯优图实验室招聘计算机视觉研究员和实习生
  20. 可迁移注意力攻击(TAA)

热门文章

  1. 教你如何成为数据科学家(六)
  2. 用Anko和Kotlin实现Android上的对话框和警告提示(KAD 24)
  3. 终于写了自己第一个有些用处的代码,留念留念,是模糊搜索并复制到指定文件夹...
  4. HDU 5727 Necklace
  5. Linux服务器程序编程的几个坎
  6. 疫情期间在公共场所要全程佩戴口罩,不要抱有侥幸心理
  7. Python语言编程之LEGB变量作用域法则
  8. 同样是程序员,优秀的程序员能够月入5万甚至50万!,一般的程序员却只能月入5千甚至更低?那么他们差别在哪里呢?
  9. 网络和计算机管理制度,网络和计算机使用管理制度
  10. 双模sa_2020年5G终端发展展望:NSA/SA双模终端将成市场“主力军”!