当前位置: 首页 > article >正文

【RDMA学习笔记】1:RDMA(Remote Direct Memory Access)介绍

从帝国理工的PPT学习。

什么是RDMA

Remote Direct Memory Access,也就是Remote的DMA,是一种硬件机制,能直接访问远端结点的内存,而不需要处理器介入。
在这里插入图片描述
其中:

  • Remote:跨node进行数据传输
  • Direct:不需要CPU或者OS kernel介入
  • Memory:从两个node各自app的虚拟地址空间直接传输数据
  • Access:支持send、receive、read、write、atomic operation

RDMA的优点

也就说明了适用场景

  • 较高的高吞吐量(带宽)
  • 较低的E2E时延
  • 较低的CPU适用:单侧的RDMA操作完全不需要remote CPU参与)
  • 较低的内存总线争用:user space和kernel之间完全不拷贝数据)
  • 异步操作:所以很适合overlapping的通信和计算

传统的TCP/IP vs RDMA

可以看到RDMA绕过kenel mode的同时也bypass了这些协议栈

协议栈对比

在这里插入图片描述

RDMA网络栈

在这里插入图片描述

准备阶段:设置RDMA的data channels

buffer在使用前需要在网卡那边注册一下,具体地,在注册阶段需要:

  • Pin memory,保证这块memory不会被OS swap出去
  • 将地址转换信息存到NIC里
  • 对这段memory region设置权限
  • 返回remote key和local key,这是给adapter在执行RDMA操作时用的

工作队列

RDMA通信是基于Send、Receive、Completion这三种队列的,其中Send和Receive的queue属于work queue,总是以Queue Pair的形式被创建。SQ和RQ用于schedule work,当work完成时,CQ用于通知。

在工作时,应用会issue一个work request,这个struct包含了指向一个buffer的指针:

  • 对于SQ,指向要发送的消息
  • 对于CQ,指向了incoming message要放入的位置

而一旦一个work request完成了,那么adapter就会往CQ里塞一个元素。

支持RDMA的网络协议

IB (InfiniBand)、RoCE (RDMA over Converged Ethernet)、iWARP (internet Wide Area RDMA Protocol)

RDMA只是一种机制

并没有指定data transfer的语义,RDMA网络支持两种访问模型:

Two Sided:RDMA send & receive

这是最传统的消息传递模式,消息源和目标方都积极地参与通信

双方都需要创建:

  • 一对QP (SQ+CQ),用于发送和接收
  • 给这对QP用的CQ

发送方的work request会指向要传输的buffer,然后把这个WQE塞到SQ里发过去。

接收方的work request会指向一个empty buffer用于接收数据,通过这种方式WQE会被添加到对应的RQ里。
在这里插入图片描述
在send+receive完成之后,也就是直接写入了remote的registered memory,然后双方的CQ里都会被添加一个CQE表示完成了。
在这里插入图片描述

One Sided:RDMA read & write + atomic操作

只有发起方是活动的,接收方是纯被动的,不会issue任何操作,也不会有CPU cycle,甚至完全不会感知到有read/write发生了。

如果要发起RDMA read/write,那么work request必须包含:

  • 远端目标内存的虚拟地址
  • 远端的memory registration key

也就是说要使用RDMA read/write,发起方必须事先就知道这两个knowledge。

基于RDMA的上层协议

RDMA有很多好处,但也因为开发者需要使用它的Verbs API带来了额外的复杂性。
在这里插入图片描述


http://www.kler.cn/a/501148.html

相关文章:

  • 战略与规划方法——深入解析波士顿矩阵(BCG Matrix):分析产品组合的关键工具
  • gesp(C++五级)(1)洛谷:B3941:[GESP样题 五级] 小杨的锻炼
  • MongoDB实践
  • IoT平台在设备远程运维中的应用
  • python异常机制
  • 30_Redis哨兵模式
  • 【单片机学习第三课---单片机IO操作】
  • vue elemnt-ui自定义时间日期选择
  • Linux开发工具--vim编辑器-gcc/g++编译器-gdb调试器
  • 案例研究:UML用例图中的结账系统
  • 红队工具使用全解析:揭开网络安全神秘面纱一角
  • 微服务的CAP定理与数据一致性抉择
  • 算法练习7——拦截导弹的系统数量求解
  • GAMES101学习笔记(三):Rasterization 光栅化(三角形的离散化、抗锯齿、深度测试)
  • Dockerfile 构建java镜像并运行部署java项目
  • uniapp中rpx和upx的区别
  • Go语言中http.Transport的Keep-Alive配置与性能优化方法
  • excel前缀和(递增求和)
  • 第2章 市场走势的分类与组合
  • 基于 GEE 下载 2000-2023 年 LANDSCAN 1 km 人口栅格数据
  • 大模型笔记:KV cache
  • WPF ——开源MVVM模式框架简介
  • 【算法日记】从零开始认识动态规划(一)
  • Java高频面试之SE-11
  • 【Rust】结构体定义域实例化
  • Golang环境配置on Macbook Air M2