RDMA入门简介

本文是对 OFA Training 第一部分的总结。

这是一份很好的学习RDMA的入门材料,从原理讲起,更容易理解。

关键术语

1. RDMA – Remote Direct Memory Acces

一种应用程序之间的通信机制

  1. Remote:说明通信双方处于远端
  2. Direct:说明通信不需要“更高权限者”的参与
  3. Memory:说明数据需要从应用A的虚拟地址转移到应用B的虚拟地址

2. Verbs

应用程序用来控制、执行RDMA操作的API

3. Channel Adapter - CA

允许应用程序直接进行RDMA操作的I/O设备

CA的概念中包含了硬件和软件两个部分

CA目前有三种类型

  1. iWARP
  2. InfiniBand
  3. RocE

4. Requester, Responder

  1. RDMA请求发送方可能发送一个“READ”、“WRITE”请求到RDMA接收方
  2. WRITE请求是将发送方写数据到接收方
  3. READ请求是发送方读数据到接收方

RDMA简介

回顾现有的I/O机制

  1. 按照冯诺依曼体系结构来看,现有的主机通常包括:CPU、MEM、IO子系统
  2. 所有的硬件资源被OS所管理:应用程序想要使用IO资源需要通过OS申请、访问、释放。
    1. 应用程序使用的是虚拟地址

    2. IO设备使用的是物理地址

    3. 地址的转换完全由OS来管理

      注:IO设备也可能用虚地址访存,参考IOMMU、SMMU

  3. 应用程序几乎所有的IO操作,都需要发起系统调用,由OS完成
    1. 应用程序通常IO操作包括三类:存储、网络、IPC

一种新的IO机制:Channel IO

  1. IO Channel可以在两个应用程序间建立直接的IO通道

    1. OS负责创建IO通道,但OS不负责IO传输
    2. 逻辑上看如下图

    Untitled

  2. IO通道物理结构如下图

    1. 一个IO通道可以在两个Channel Adapters上建立
    2. IO通道对上层应用提供API进行控制、传输,称为channel interface
    3. channel interface是运行在用户态的

    Untitled

消息传递

地址翻译

1. 三次地址翻译概述

远程通信需要进行三次地址翻译,如下图所示

2. 三次地址翻译实现方式

  1. 基于OS实现三次地址翻译

    1. OS来完成虚拟→物理/物理→虚拟地址的翻译
    2. OS实现的地址翻译可以保证,每个应用程序对应的虚拟地址都是独立的。

  2. 基于通道适配器CA来实现三次地址翻译

    1. 通道适配器来完成地址翻译的话则不需要OS介入,如下图所示

    2. 地址映射表保存在通道适配器CA中,但是由OS创建;OS不介入到地址翻译的过程中

3. 远端虚拟地址直接访问

  1. 一个IO通道可以暴露给应用程序A一段本机不存在的虚拟地址

    1. 换言之,这段虚拟地址被映射到了远端的应用程序。
    2. RDMA技术就是在解决:应用程序A如何直接访问远端应用程序的虚拟地址?

    **Virtual-to-virtual transfers**

RDMA通信原理简介

回顾socket通信原理

  1. socket应用程序会将应用程序要发送的数据,从应用缓冲区拷贝到内核缓冲区中。
  2. OS中的TCP栈负责将内核缓冲区的字节传输到远端。
  3. OS中的TCP栈只负责传输字节(这里没有消息的概念),是字节流

RDMA通信架构

  1. 大概可以分为三层:软件层接口、RDMA协议层、网络传输层

软件层接口

  1. 软件层接口

    1. 提供一个应用程序可以访问的队列接口,用来将应用程序发来的请求保序
    2. 是一个面向消息的架构(区别于socket是面向字节流的)
  2. 队列接口

    1. 包含两种队列
      1. QP:等待被执行的任务队列(Queue Pair)
      2. CQ:已经完成的任务队列(Completion queue)
    2. CQ中的一个标识可能标志多个QP中的任务已完成
  3. Queue Pair

    1. 如下图所示

    2. QP总是成对出现的,包含一个发送队列、一个接受队列

    3. 一个应用程序可以创建多个QP,一个QP只对应一个应用程序

  4. Work requests 任务请求

    1. 一个 Work requests ,WR 描述了一个等待被执行的任务,可能是一个发送任务,也可能是一个接受任务

    2. 应用程序发起一个任务请求,任务请求会被保存到队列中,称为Post a WR

      1. Work Queue中的一个Work reqeuest称为Work Queue Element (WQE – pronounced wookie)
      2. completion queue entry 称为 CQEs ,pronounced cookie

  5. Queue接口是异步的

    1. 应用程序发起请求后,不等待任务完成
    2. 一旦一个或多个任务被完成,CQ中会放入CQE来通知应用程序
  6. QP队列中的WRE序列问题

    1. 一个WR(QP中的一个队列)中的所有发送请求是严格保序的
    2. 一个WR中的所有接受请求是严格保序的
    3. 发送队列和接受队列中的元素没有序列要求
    4. QP之间没有序列要求
  7. QP的连接

    1. 一旦两个应用程序通过设备相连,两个应用程序对应的QP也就连接起来了
    2. 应用A向发送队列写入的WR,会发送到通道的另一端。
    3. 再一次强调,一个QP只能用于一个应用程序
  8. 软件层接口的使用

    1. 用户创建一个用来收/发消息的 Work Request
    2. 为了发送消息,用户使用 Post Send Request , or Post Receive Request Verbs(API) 来将这个WR填充到到某个QP的发送队列或者接受队列

RDMA协议层

  1. RDMA协议层主要用于地址的转换

  2. RDMA的消息种类

    1. SEND/RECEIVE: 进行通道IO
      1. 如下图所示

      2. 流程如下所示

        1. 请求方Post一个SEND WR到对应的发送队列中
          1. SEND WQE中描述了发送端buffer的信息,以及目的端口号DLID、目的QP号
        2. 相应方Post一个RECEIVE WR到对应的接受队列中
          1. RECEIVE WR描述了下一个接受的信息可以用的内存地址
        3. 接受端buffer信息一定要先于发送端信息被post
    2. RDMA READ/WRITE :进行远端内存操作
      1. 响应方的buffer由“虚拟地址 + RDMA Key”组成的描述符所描述

        1. 响应方需要将本端的buffer描述符通过SEND 消息传递给请求方
        2. 请求方使用收到的描述符,对远端内存进行READ/WRITE操作,之后响应方对buffer不可读写
        3. 直到请求方通知响应方WR/RD完成,响应方的应用程序才能读写buffer

      2. RDMA Write

        响应方的CA处理dst VA → dst PA 的地址翻译

      3. RDMA READ

        左侧是请求方,右侧是响应方

        请求方的CA处理src VA到src PA的地址转换(读回的数据写入到哪里的问题)

  3. RDMA 协议层总结

    1. SEND/RECEIVE 请求是一个端到端的操作
    2. 一个SEND操作,会消耗一个请求方QP的WQE,也会消耗一个响应方QP的WQE
    3. RECEIVE WQE 一定要在 SEND WQE 之前发出
    4. RDMA READ/WRITE 提供了应用程序可以直接访问远端内存缓冲的方法

网络传输层

  1. 传输层必须对上提供可靠的、面向连接的服务
  2. “可靠”的含义:数据必须按序交付给接收方,并且不能出现重复和错误
    1. 不能出现错误:如果出现错误,可靠的服务要么可以从字节序列中恢复错误(比如编码方式可以容错),要么报告给应用程序
  3. “连接”的含义
    1. 连接指的是两个主机的两队QP进行连接

Verbs 简介

Verbs API是应用程序进行RDMA消息传递的编程接口,如下图所示

可以想像成底层为两端的QP对/两端的CQ对建立了虚拟的IO通道

应用程序使用channel IO 进行通信的流程

  1. 打开一个HCA(Host CA)
  2. 创建一个Protection Domain
  3. 创建一个Queue Pair
  4. 创建一个/或一组 Completion Queue
  5. 注册内存区域Memory Regions
  6. 发起任务请求Work reqeust
  7. 等待CQ的完成任务通知

Verbs的含义

  1. Verb一次最早由InfiniBand Architecture Specification提出,大约在1999年
  2. 一个Verb更多地是在描述一个动作“语义”,并没有描述编程接口,也与各个OS特性无关的
  3. 不同厂商的RDMA实现:RoCE、IB、IWARP,均对用户提供统一的Verbs API接口

RDMA的隔离和保护机制

  1. Protection Domain的隔离与保护
    1. 每个PD和下列组件绑定在一起

      1. 一个或者多个QPs
      2. 一段内存区域
      3. 一个应用程序

    2. PD由Verbs调用而分配出来

    3. PD确保只有注册到该虚拟内存的QP才能访问它。

  2. Memory Registration
    1. 应用程序可以向HCA注册一段内存区域
    2. HCA返回这段内存的描述符
      1. Virtual Address
      2. RKEY
      3. LKEY
    3. LKEY是用来让应用程序访问这段内存的
    4. RKEY是用来让远端应用程序访问这段内存的(将会传给远端的调用者,此时本地是响应者)
  3. Channel
    1. 用户通过Memory Registration 方法来创建本进程绑定的WQ和CQ,
      1. 创建出来的通道位于本进程的虚拟地址范围内。
      2. 读写访问不涉及内核态切换
    2. channel之间的隔离依靠OS提供的进程隔离机制

RDMA入门简介
https://gwzlchn.github.io/202205/rdma-ofa-training-1/
作者
Zelin Wang
发布于
2022年5月27日
更新于
2022年10月23日
许可协议