使用Soft-RoCE实践RDMA

news2024/12/24 4:00:46

RDMA介绍

RDMA( Remote Direct Memory Access )意为远程直接地址访问,通过RDMA,本端节点可以“直接”访问远端节点的内存。所谓直接,指的是可以像访问本地内存一样,绕过传统以太网复杂的TCP/IP网络协议栈读写远端内存,而这个过程对端是不感知的,而且这个读写过程的大部分工作是由硬件而不是软件完成的。

RDMA本身指的是一种技术,具体协议层面,包含Infiniband(IB),RDMA over Converged Ethernet(RoCE)和internet Wide Area RDMA Protocol(iWARP)。三种协议都符合RDMA标准,使用相同的上层接口,在不同层次上有一些差别。RoCE成本比IB低,效果比iWARP好。

RDMA技术实际应用的话是得依赖网卡来完成大部分工作的,需要硬件层面支持RDMA协议的智能网卡,好在我们有Soft-RoCE,它通过软件代替硬件来将IB传输层的报文加在普通UDP报文中,从而得以让普通网卡也可以发送RoCE报文,这对于为我们学习IB传输层协议,以及编写调试基于Verbs的RDMA程序提供了一种非常低成本的方案。接下来就介绍如何安装Soft-RoCE。

Soft-RoCE与网卡硬件支持的RoCE对比如下:

 下面我们就开始演示在Linux上实践RoCE。

安装Soft-RoCE

apt-get安装必要组件

$ sudo apt-get install libibverbs1 ibverbs-utils
软件包名主要功能
libibverbs1ib verbs动态链接库
ibverbs-utilsibverbs示例程序
librdmacm1rdmacm动态链接库
libibumad3ibumad动态链接库
ibverbs-providersibverbs各厂商用户态驱动(包括RXE)
rdma-core文档及用户态配置文件

 加载驱动

$ sudo modprobe rdma_rxe

创建支持RDMA协议的逻辑网卡

$ sudo rdma link add rxe0 type rxe netdev enp0s3

查看创建的RXE逻辑接口

$ ibv_devices
    device                 node GUID
    ------              ----------------
    rxe0                0a0027fffe5ac323

$ ibv_devinfo -d rxe0
hca_id: rxe0
        transport:                      InfiniBand (0)
        fw_ver:                         0.0.0
        node_guid:                      0a00:27ff:fe5a:c323
        sys_image_guid:                 0a00:27ff:fe5a:c323
        vendor_id:                      0xffffff
        vendor_part_id:                 0
        hw_ver:                         0x0
        phys_port_cnt:                  1
                port:   1
                        state:                  PORT_ACTIVE (4)
                        max_mtu:                4096 (5)
                        active_mtu:             1024 (3)
                        sm_lid:                 0
                        port_lid:               0
                        port_lmc:               0x00
                        link_layer:             Ethernet
$ sudo rdma link show
link rxe0/1 state ACTIVE physical_state LINK_UP netdev enp0s3
$ sudo ibstat
CA 'rxe0'
        CA type:
        Number of ports: 1
        Firmware version:
        Hardware version:
        Node GUID: 0x0a0027fffe5ac323
        System image GUID: 0x0a0027fffe5ac323
        Port 1:
                State: Active
                Physical state: LinkUp
                Rate: 2.5
                Base lid: 0
                LMC: 0
                SM lid: 0
                Capability mask: 0x00010000
                Port GUID: 0x0a0027fffe5ac323
                Link layer: Ethernet

测试RDMA连通性

Server端

$ sudo rping -s -a 192.168.31.79 -v -C 10
[sudo] password for wq:
server ping data: rdma-ping-0: ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqr
server ping data: rdma-ping-1: BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs
server ping data: rdma-ping-2: CDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst
server ping data: rdma-ping-3: DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu
server ping data: rdma-ping-4: EFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuv
server ping data: rdma-ping-5: FGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvw
server ping data: rdma-ping-6: GHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwx
server ping data: rdma-ping-7: HIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy
server ping data: rdma-ping-8: IJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
server ping data: rdma-ping-9: JKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyzA
server DISCONNECT EVENT...
wait for RDMA_READ_ADV state 10

Client端

$ rping -c -a 192.168.31.79 -v -C 10
ping data: rdma-ping-0: ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqr
ping data: rdma-ping-1: BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs
ping data: rdma-ping-2: CDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst
ping data: rdma-ping-3: DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu
ping data: rdma-ping-4: EFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuv
ping data: rdma-ping-5: FGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvw
ping data: rdma-ping-6: GHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwx
ping data: rdma-ping-7: HIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy
ping data: rdma-ping-8: IJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
ping data: rdma-ping-9: JKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyzA
client DISCONNECT EVENT...

 wireshark抓包验证如下

 

RDMA编程用户手册

手册的CSDN下载链接

RDMA编程用户手册里介绍的API有 初始化、设备操作、Verbs上下文操作、保护域操作、Queue Pair使能、激活Queue Pair操作、事件句柄操作、实验APIs等。

编写测试程序

安装用户态依赖库

$ sudo apt-get install libibverbs-dev

从git上拉取测试示例

$ git clone https://gitee.com/wq897/RDMA-EXAMPLE.git
$ cd RDMA-EXAMPLE/01/ && make

运行服务端程序

$ sudo ./service
 ------------------------------------------------
 Device name : "(null)"
 IB port : 1
 TCP port : 19875
 ------------------------------------------------

waiting on port 19875 for TCP connection
TCP connection was established
searching for IB devices in host
found 1 device(s)
device not specified, using first one found: rxe0
going to send the message: 'SEND operation '
MR was registered with addr=0x55d57ea7c340, lkey=0x49b, rkey=0x49b, flags=0x7
QP was created, QP number=0x13

Local LID = 0x0
Remote address = 0x558d59dbb340
Remote rkey = 0x43d
Remote QP number = 0x13
Remote LID = 0x0
failed to modify QP state to RTR
failed to modify QP state to RTR
failed to connect QPs

test result is 1

运行客户端程序

$ sudo ./service 192.168.3.79
servername=192.168.3.79
 ------------------------------------------------
 Device name : "(null)"
 IB port : 1
 IP : 192.168.3.79
 TCP port : 19875
 ------------------------------------------------

TCP connection was established
searching for IB devices in host
found 1 device(s)
device not specified, using first one found: rxe0
MR was registered with addr=0x558d59dbb340, lkey=0x43d, rkey=0x43d, flags=0x7
QP was created, QP number=0x13

Local LID = 0x0
Remote address = 0x55d57ea7c340
Remote rkey = 0x49b
Remote QP number = 0x13
Remote LID = 0x0
Receive Request was posted
failed to modify QP state to RTR
failed to modify QP state to RTR
failed to connect QPs

test result is 1

上述代码中打印“failed to modify QP state to RTR”错误,debug为ibv_modify_qp() 返回错误码为22错误,即ibv_modify_qp的参数struct ibv_qp_attr attr错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/779324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Github 上有没有优秀的Java 项目推荐?

前言 下面是我精心整理的GitHub上关于Java的高Star的项目,可以自己选择去练手喔,希望对你有帮助~ 我们直接进入正题——> 1、 JavaGuide Star:135k JavaGuide指的是一份完整的Java学习指南或学习资料,它提供了Java编程语言…

AcWing4118. 狗和猫

输入样例1: 3 6 10 4 0 CCDCDD 4 1 2 0 CCCC 4 2 1 0 DCCD输出样例1: Case #1: YES Case #2: YES Case #3: NO样例1解释 在 Case 1 中,一共有 1010 份狗粮和 44 份猫粮。 前两只动物是猫,喂食它们后,还剩下 22 份猫粮…

数据结构之BinaryTree(二叉树)的实现

BinaryTree要实现的方法 总结 remove不在BinNode里,而是BinTree里 递归的两种写法 从上往下:同一对象的递归(参数多一个,判空用一句话),子对象的递归(参数void,判空用两句话&#…

算法分析和设计简答题

算法分析和设计简答题 1.1分治法的算法思想(重点) 1.2动态规划的算法思想(重点) 1.3贪心算法的算法思想 1.4回溯算法的算法思想 1.5分支限界法的算法思想 1.6时间复杂度的定义(最好/一般/坏),有什么意思 1.7渐进记号…

【Git】分支合并冲突产生与解决

文章学习自:麦兜搞IT,如有侵权,告知删除 文章目录 前言1 Fast Forword 合并1.1 核心原理1.2 举个栗子1.3 经验之谈 2 three way merge2.1 核心原理2.2 举个栗子(不带冲突)2.3 带冲突的three way merge 3 变基rebase3.…

Windows上配置Python环境变量

Python配置环境变量 🍁博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! Python下载官网&#xff1…

GB28181设备接入端如何播放语音广播数据?

技术背景 语音广播功能是GB28181设备接入端非常重要的功能属性,语音广播让终端和平台之间,有了实时双向互动,可以满足执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育、远程办公、明厨亮灶、智慧交通、智慧工地、雪亮工程、平安乡村、…

Docker介绍以及实战教程

Docker简介 Docker为什么出现 从事软件开发的朋友,可能经常会碰到以下场景:运维:你这程序有Bug啊,怎么跑不起来啊!开发:我机子上能跑啊,你会不会用啊究其原因还是开发环境与生产环境不同造成的…

基于linux下的高并发服务器开发(第二章)- 2.18 内存映射(2)

1.如果对mmap的返回值(ptr)做操作(ptr), munmap是否能够成功? void * ptr mmap(...);ptr; 可以对其进行操作munmap(ptr, len); // 错误,要保存地址 2.如果open时O_RDONLY, mmap时prot参数指定PROT_READ | PROT_WRITE会怎样? 错误,返回MAP_FAILEDopen()函数中的…

cpolar+calibre搭建自己的kindle书库

cpolarcalibre搭建自己的kindle书库 在我们身边众多的便携电子设备中,Kindle无疑是最为矛盾的设备之一,很多人在买它时都想读书破万卷,可是到最后Kindle的归宿都是盖泡面。尽管如此,当亚马逊不讲武德,打算将Kindle真正…

FPGA中RAM的结构理解

FPGA中RAM的结构理解 看代码的过程中对RAM的结构不是很理解,搞脑子一片浆糊,反复推算,好不容易理清了思路,记录下来,防止忘记。开辟的RAM总容量为128bytes,数据的位宽为32位(即一个单元有32bit…

CodeForces:Madoka and Underground Competitions

经过观察&#xff0c;发现只要延小区域 右上-左下 的对角线填满X即可&#xff0c;那么就是可以总结为满足(i j) % k (r c) % k #include <bits/stdc.h> using namespace std; int t; void solve(){int n, k, r, c;cin >> n >> k >> r >> c…

团队如何选择合适的Git分支策略?

现代软件开发过程中要实现高效的团队协作&#xff0c;需要使用代码分支管理工具实现代码的共享、追溯、回滚及维护等功能。目前流行的代码管理工具&#xff0c;包括CVS&#xff0c;SVN&#xff0c;Git&#xff0c;Mercurial等。 相比CVS和SVN的集中管理&#xff0c;Git具有非常…

【stable diffusion】保姆级入门课程03-Stable diffusion(SD)图生图-涂鸦(绘图)的用法

目录 0.本章素材 1.涂鸦有什么用 2.涂鸦的使用场景是什么 3.操作面板 4.提示词与涂鸦 5.涂鸦与重绘幅度 6.涂鸦的其他用法(自由创作) 7.课后训练 0.本章素材 Realistic Vision V3.0模型(真实系模型)百度网盘链接&#xff1a;https://pan.baidu.com/s/1HkSKW2t4L6wMg…

openlayers系列:加载arcgis和geoserver在线离线切片

https://www.freesion.com/article/1751396517/ 1.背景 有个项目需要使用openlayer加载各种服务上发布的数据&#xff0c;坐标系也不同&#xff0c;我们都知道openalyer默认可以加载EPAG:3857,要加载4490的坐标系的数据需要重新定义一下&#xff0c;之后再加载。一想起要重新…

[SQL系列] 从头开始学PostgreSQL 事务 锁 子查询

[SQL系列] 从头开始学PostgreSQL 索引 修改 视图_Edward.W的博客-CSDN博客https://blog.csdn.net/u013379032/article/details/131818865 事务 事务是一系列逻辑相关的数据库操作&#xff0c;可以作为一个整体进行操作或者回滚。事务通常会包含一个序列的读或者写操作&#xf…

No4: Python脚本的交互式运用

No4: Python脚本的交互式运用 1、 先安装了Python和环境变量设置 2、编写Pthon脚本 3、在脚本所在目录位置下&#xff0c;Python 脚本&#xff1b;

Nginx系列之 一 负载均衡

目录 一、Nginx概述 1.1 负载均衡概述 1.2 负载均衡的作用 1.3 四/七层负载均衡 1.3.1 网络模型简介 1.3.2 四层和七层负载均衡对比 1.3.3 Nginx七层负载均衡实现 1.4 Nginx负载均衡配置 1.5 Nginx负载均衡状态 1.6 Nginx负载均衡策略 二、负载均衡实战 2.1 测试服…

论文笔记--Won’t Get Fooled Again: Answering Questions with False Premises

论文笔记--Won’t Get Fooled Again: Answering Questions with False Premises 1. 文章简介2. 文章概括3 文章重点技术3.1 大模型面对FPQs的表现3.2 False QAs数据集3.3 训练和评估 4. 文章亮点5. 原文传送门 1. 文章简介 标题&#xff1a;Won’t Get Fooled Again: Answerin…