首页 > 其他分享 >Rdma-core介绍及编译

Rdma-core介绍及编译

时间:2023-06-13 19:05:35浏览次数:28  
标签:core 00 QP 编译 RDMA Rdma wr rdma ibv

一、RDMA lib库安装 1.1 介绍 广义的Verbs API主要由两大部分组成verbs和rdma_cm Verbs API 操作RDMA的函数接口,也就是说业界的RDMA应用,要么直接基于这组API编写,要么基于在Verbs API上又封装了一层接口的各种中间件编写。(rdma_cm) Verbs API向用户提供了有关RDMA的一切功能,典型的包括:注册MR、创建QP、Post Send、Poll CQ等等。

对于Linux系统来说,Verbs的功能由rdma-core和内核中的RDMA子系统提供,分为用户空间驱动的 Verbs api和内核空间驱动的Verbs api,分别用于用户态和内核态的RDMA 程序。

1.2 rdma_cm和verbs的区别
1> rdma_cm依赖ib_verbs
2> ib_verbs和rdma_cm 都是Mellanox公司提供的两个动态链接库。(这两个库的API ,queue pair (QP)  类似于 TCP的sockets)
3> rdma_cm连接管理器库,包含了对ib_verbs的封装或具体化,通过verbs API 对硬件进行访问。
	rdma_post_send  = ibv_post_send(qp,wr.opcode=IBV_WR_SEND,bad_wr)  
	rdma_post_read  = ibv_post_send(qp,wr.opcode=IBV_WR_RDMA_READ ,bad_wr) 
	rdma_post_write  = ibv_post_send(qp,wr.opcode=IBV_WR_RDMA_WRITE,bad_wr) 


1.3 IB_VERBS
接口以ibv_xx(用户态)或者ib_xx(内核态)作为前缀,是最基础的编程接口,使用IB_VERBS就足够编写RDMA应用了。
比如:
ibv_create_qp() 用于创建QP
ibv_post_send() 用于下发Send WR
ibv_poll_cq() 用于从CQ中轮询CQE

1.4 常用API介绍
device_list ibv_get_device_list()
用户获取可用的RDMA设备列表,会返回一组可用设备的指针。

device_context ibv_open_device(device)
打开一个可用的RDMA设备,返回其上下文指针(这个指针会在以后用来对这个设备进行各种操作)。

device_attr, errno ibv_query_device(device_context*)
查询一个设备的属性/能力,比如其支持的最大QP,CQ数量等。返回设备的属性结构体指针,以及错误码。

pd ibv_alloc_pd(device_context)
申请PD。该函数会返回一个PD的指针。(PD(内存)保护域

mr ibv_reg_mr(pd, addr, length, access_flag)
注册MR。用户传入要注册的内存的起始地址和长度,以及这个MR将要从属的PD和它的访问权限(本地读/写,远端读/写等),返回一个MR的指针给用户。

cq ibv_create_cq(device_context, cqe_depth, ...)
创建CQ。用户传入CQ的最小深度(驱动实际申请的可能比这个值大),然后该函数返回CQ的指针

qp ibv_create_qp(pd, qp_init_attr)
创建QP。用户传入PD和一组属性(包括RQ和SQ绑定到的CQ、QP绑定的SRQ、QP的能力、QP类型等),向用户返回QP的指针

errno ibv_modiy_qp(qp, attr, attr_mask)
修改QP。用户传入QP的指针,以及表示要修改的属性的掩码和要修改值。修改的内容可以是QP状态、对端QPN(QP的序号)、QP能力、端口号和重传次数等等。如果失败,该函数会返回错误码。Modify QP最重要的作用是让QP在不同的状态间迁移,完成RST-->INIT-->RTR-->RTS的状态机转移后才具备下发Send WR的能力。也可用来将QP切换到ERROR状态。

errno ibv_destroy_qp(qp)
销毁QP。即销毁QP相关的软件资源。其他的资源也都有类似的销毁接口。

event_info, errno ibv_get_async_event(device_context)
从事件队列中获取一个异步事件,返回异步事件的信息(事件来源,事件类型等)以及错误码

bad_wr, errno ibv_post_send(qp, wr)
向一个QP下发一个Send WR,参数wr是一个结构体,包含了WR的所有信息。包括wr_id、sge数量、操作码(SEND/WRITE/READ等以及更细分的类型)。
WR的结构会根据服务类型和操作类型有所差异,比如RC服务的WRITE和READ操作的WR会包含远端内存地址和R_Key,UD服务类型会包含AH,远端QPN和Q_Key等。
WR经由驱动进一步处理后,会转化成WQE下发给硬件。
出错之后,该接口会返回出错的WR的指针以及错误码。

bad_wr, errno ibv_post_recv(qp, wr)
专门用来下发RECV操作WR的接口

num, wc ibv_poll_cq(cq, max_num)
从完成队列CQ中轮询CQE,用户需要提前准备好内存来存放WC,并传入可以接收多少个WC。该接口会返回一组WC结构体(其内容包括wr_id,状态,操作码,QPN等信息)以及WC的数量

1.5 ib_verbs lib库安装
	cd /etc/yum.repos.d
	rm -rf ./*
	//更换yum源
	wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
	
	wget -O /etc/yum.repos.d/CentOS-Base.repo https://github.com/hackyoMa/docker-centos/blob/8/CentOS-Base.repo
	yum -y clean all
	yum -y makecache
	yum repolist
	//安装rdma
	yum install rdma
>>>结果:		
软件包 rdma-core-26.0-8.el8.x86_64 已安装。
依赖关系解决。
==============================================================================================================================================================================================================
 软件包                                                  架构                                          版本                                                 仓库                                         大小
==============================================================================================================================================================================================================
升级:
 ibacm                                                   x86_64                                        35.0-1.el8                                           base                                         95 k
 infiniband-diags                                        x86_64                                        35.0-1.el8                                           base                                        323 k
 iwpmd                                                   x86_64                                        35.0-1.el8                                           base                                         36 k
 libibumad                                               x86_64                                        35.0-1.el8                                           base                                         33 k
 libibverbs                                              x86_64                                        35.0-1.el8                                           base                                        335 k
 libibverbs-utils                                        x86_64                                        35.0-1.el8                                           base                                         82 k
 librdmacm                                               x86_64                                        35.0-1.el8                                           base                                         78 k
 librdmacm-utils                                         x86_64                                        35.0-1.el8                                           base                                        100 k
 rdma-core                                               x86_64                                        35.0-1.el8                                           base                                         59 k
 srp_daemon   


软件包名         	主要功能
libibverbs1      	ibverbs动态链接库
ibverbs-utils    	ibverbs示例程序
librdmacm1		 	rdmacm动态链接库
libibumad3		 	ibumad动态链接库
ibverbs-providers   ibverbs各厂商用户态驱动(包括RXE)
rdma-core           文档及用户态配置文件

二、soft-Roce介绍 2.1 简介 Soft-RoCE是一种基于软件的RoCE(RDMA over Converged Ethernet)实现。RoCE是一种在以太网上实现RDMA(Remote Direct Memory Access)的技术, 它允许数据在网络中直接传输,而无需CPU的干预,从而提高了数据传输的效率和性能。传统的RoCE实现需要专用的网络适配器和交换机,而Soft-RoCE 则允许使用普通的以太网适配器和交换机来实现RDMA。Soft-RoCE通常通过内核模块的形式提供,可以在Linux系统上使用。 把本来应该卸载到硬件的封包和解析工作,又拿到软件来做。其本身是基于Linux内核的TCP/IP协议栈实现的,网卡本身并不感知收发的数据包是RoCE报文, 其驱动程序按照IB规范中的报文格式将用户数据封装成IB传输层报文,然后把报文整体当做数据填入Socket Buffer当中,由网卡进行下一步收发包处理。 2.2 Soft-RoCE部署及通信测试 步骤: a. 确认内核是否支持RXE cat /boot/config-$(uname -r) | grep RXE 如果CONFIG_RDMA_RXE的值为y或者m,表示当前的操作系统可以使用RXE。 b. 安装其他工具 //iproute2是用来替代net-tools软件包的,是一组开源的网络工具集合,比如用更强大ip命令替换了以前常用的ifconfig。 我们需要其中的rdma工具来对RXE进行配置。一般的操作系统都已经包含了,安装: yum install iproute //perftest是一个基于Verbs接口开发的开源RDMA性能测试工具,可以对支持RDMA技术的节点进行带宽和时延测试。 相比于rdma-core自带的示例程序 ,功能更加强大,当然也更复杂。使用如下命令安装: yum install perftest c. 配置RXE网卡 //首先我们需要加载内核驱动,modprobe会自动加载依赖的其他驱动。 modprobe rdma_rxe //进行用户态配置: rdma link add rxe_0 type rxe netdev enp2s0 //确认绑定ok [root@localhost admin]# rdma link link rxe_0/1 state ACTIVE physical_state LINK_UP netdev enp2s0 [root@localhost admin]# ibv_devices device node GUID ------ ---------------- rxe_0 067c16fffec69735

d. 执行perftest测试
	在两端分别执行:
	ib_send_bw -d rxe_0
	以及:
	ib_send_bw -d rxe_1 192.168.1.58
	[root@localhost admin]# ib_send_bw -d rxe_1
	************************************
	* Waiting for client to connect... *
	************************************
	---------------------------------------------------------------------------------------
						Send BW Test
	 Dual-port       : OFF          Device         : rxe_0
	 Number of qps   : 1            Transport type : IB
	 Connection type : RC           Using SRQ      : OFF
	 PCIe relax order: Unsupported
	 ibv_wr* API     : OFF
	 RX depth        : 512
	 CQ Moderation   : 1
	 Mtu             : 1024[B]
	 Link type       : Ethernet
	 GID index       : 1
	 Max inline data : 0[B]
	 rdma_cm QPs     : OFF
	 Data ex. method : Ethernet
	---------------------------------------------------------------------------------------
	 local address: LID 0000 QPN 0x0013 PSN 0x706017
	 GID: 00:00:00:00:00:00:00:00:00:00:255:255:192:168:01:58
	 remote address: LID 0000 QPN 0x0011 PSN 0x596a8e
	 GID: 00:00:00:00:00:00:00:00:00:00:255:255:192:168:01:59
	---------------------------------------------------------------------------------------
	 #bytes     #iterations    BW peak[MB/sec]    BW average[MB/sec]   MsgRate[Mpps]
	
	[root@localhost admin]# ib_send_bw -d rxe_1 192.168.1.58
	---------------------------------------------------------------------------------------
						Send BW Test
	 Dual-port       : OFF          Device         : rxe_1
	 Number of qps   : 1            Transport type : IB
	 Connection type : RC           Using SRQ      : OFF
	 PCIe relax order: Unsupported
	 ibv_wr* API     : OFF
	 TX depth        : 128
	 CQ Moderation   : 1
	 Mtu             : 1024[B]
	 Link type       : Ethernet
	 GID index       : 1
	 Max inline data : 0[B]
	 rdma_cm QPs     : OFF
	 Data ex. method : Ethernet
	---------------------------------------------------------------------------------------
	 local address: LID 0000 QPN 0x0011 PSN 0x596a8e
	 GID: 00:00:00:00:00:00:00:00:00:00:255:255:192:168:01:59
	 remote address: LID 0000 QPN 0x0013 PSN 0x706017
	 GID: 00:00:00:00:00:00:00:00:00:00:255:255:192:168:01:58
	---------------------------------------------------------------------------------------
	 #bytes     #iterations    BW peak[MB/sec]    BW average[MB/sec]   MsgRate[Mpps]

e. 在任一节点,可以抓包
[root@localhost admin]# tcpdump udp port 4791
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp2s0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:52:06.162142 IP 192.168.1.59.57236 > localhost.localdomain.roce: UDP, length 1040
14:52:06.162169 IP 192.168.1.59.57236 > localhost.localdomain.roce: UDP, length 1040
14:52:06.162174 IP 192.168.1.59.57236 > localhost.localdomain.roce: UDP, length 1040

2.3 端口配置命令

加载RDMA内核模块					rdma link add <rxe name>(自己定义) type rxe netdev ens33(虚机网口)

查看设备列表			            ibv_devices 

查看虚拟RDMA设备简略信息			ibv_devinfo -d <网卡名称>

删除RDMA内核模块					rdma link delete <rxe name>

查看RDMA连接状态					rdma link show

更改MTU包大小						sudo ifconfig <网卡名称> mtu <MTU包大小>

显示所有RDMA网口的所有信息			ibv_devinfo -v

查看链路类型						ibstat

查看网络中infiniband设备			ibnodes

三 、RDMA-core编译和安装

step 1: //卸载任何先前版本的rdma-core用户空间库 yum erase rdma-core

step 2: 上传rdma-core-35.0.zip到58.59机器

step 3: 解压

step 4: 安装依赖 dnf builddep redhat/rdma-core.spec

step 5: $ ./build.sh 会提示缺少一些包(不影响编译结果,可能影响某些功能),在58、59机器所有依赖都已解决: -- Missing Optional Items: -- Compiler attribute symver NOT supported, can not use LTO -- pandoc NOT found and NO prebuilt man pages. 'install' disabled -- rst2man NOT found and NO prebuilt man pages. 'install' disabled -- cython NOT found (disabling pyverbs)

step 6: 调试: 在新生成的build目录下,build/bin将包含示例程序,build/lib将包含共享库,开发主要使用该文件进行联调 install: 在rdma-core目录下,a. cmake . //检查 b. make c. make install make install -> 存在问题:安装的.so文件在cp /usr/local/lib64目录下 但命令在/usr/lib64下寻找 (strace + 命令 可以查看调用路径)

step 7: 测试: server: ibv_rc_pingpong -g 1 -d rxe0 client: ibv_rc_pingpong -g 1 -d rxe0 192.168.1.58 注意:在研发环境必须携带-g 1,才会获取到GID

调用路径:app->libibverbs.so->用户态驱动->ib_uverbs.ko->ib_core.ko->内核态驱动->硬件

标签:core,00,QP,编译,RDMA,Rdma,wr,rdma,ibv
From: https://blog.51cto.com/u_16113732/6471973

相关文章

  • .NET编译项目时出现《此实现不是 Windows 平台 FIPS 验证的加密算法的一部分》处理方
    此实现不是Windows平台FIPS验证的加密算法的一部分。”)的问题,如下图所示:对于上面的问题,只需要修改下注册表即可处理,方法如下:1、以管理员方式启动命令行工具后输入regedit,回车打开注册器;。2、打开注册表后,进入路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Co......
  • Linux系统下如果在编译时指定程序运行时动态链接库相对目录,及为程序收集默认不安装动
    1、在编译中指定编译的程序去查找的动态链接库目录qmake是这样指定运行时动态库目录的:  QMAKE_LFLAGS+=-Wl,-rpath=/usr/local/ultrasec/policyfilter/lib/ 2、用lddPROG  查看程序的动态链接库,如果没有的动态链接库,就从其它计算机或者网络上找这个库,然后拷贝到指......
  • 利用dotnet core的代码生成实现类型转换
    利用dotnetcore的代码生成的特性,自动生成类型转换的代码。类似于AutoMaper,但是代码生成近似于手写代码,不用反射,性能更好生成通过比较属性名字(不区分大小写)属性支持简单类型,类,List,Dictionary(key最好是string类型)在需要转换的类上标记特性:ConvertFrom、ConvertTo[Conv......
  • javascript反编译工具javascript-obfuscator的环境搭建
    javascript-obfuscator的项目和文档地址:https://github.com/javascript-obfuscator/javascript-obfuscatorwindows端安装nodejs环境打开nodejs安装包,一直点NEXT,默认设置安装即可。安装后:#测试nodejs和npm是否已安装npm-v#如果有输出版本号,例如输出9.5.0,表示安装成功#查看......
  • NET CORE Configuraion 使用详解 获取配置文件参数 读取环境变量、读取配置文件、读取
    NETCOREConfiguraion使用详解获取配置文件参数读取环境变量、读取配置文件、读取Ini配置、读取Xml配置、多源配置读取顺序分析https://blog.csdn.net/qq_32109957/article/details/127998326相关配置<ProjectSdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Ex......
  • 14.拷贝构造函数、静态、友元和预编译头
    拷贝构造函数静态友元预编译头拷贝构造函数eg:Playeer.h代码:#pragmaonceclassPlayeer{private:intnum;char*name;public:Playeer(intx,constchar*name);~Playeer();voiddisplay();//输出结果voidsetX(intx);//......
  • Latex编译器推荐(面向初学者或者懒得折腾的朋友,主要针对windows用户)
    原文链接:https://blog.sciencenet.cn/blog-478347-1215384.html大家平时用的最多的排版工具想必就是Microsort的Word或者WPS了,所见即所得,Latex是另外一种排版工具,需要编译才可以生成pdf。相信大家在投稿的时候,会发现很多杂志都提供的textemplate。至于Latex好还是word好,这个已......
  • ASP.NET Core 6框架揭秘实例演示[37]:重定向的N种实现方式
    在HTTP的语义中,重定向一般指的是服务端通过返回一个状态码为3XX的响应促使客户端像另一个地址再次发起请求,本章将此称为“客户端重定向“。既然有客户端重定向,自然就有服务端重定向,本章所谓的服务端重定向指的是在服务端通过改变请求路径将请求导向另一个终结点。ASP.NET下的重定......
  • 乘风破浪,遇见最美Windows 11之现代Windows桌面应用开发 - .NET反编译神器dotPeek,免费
    什么是dotPeekhttps://www.jetbrains.com/decompiler/dotPeek是由鼎鼎有名的JetBrains开发的免费.Net反编译软件。其界面和VisualStudio一样现代。获取dotPeekhttps://www.jetbrains.com/decompiler/download/download-thanks.html?platform=windowsWebJetBrains.dotP......
  • 简单编译器
    目录0x01背景0x02SML语法0x03应用源码:编译过程:sml.txt文件:执行0x04SML_C实现sml_compiler.hsml_compiler.c0x05总结0x01背景《C语言大学教程-第八版》(《CHowtoProgram》)391页,第十二章作业,专题:创建自己的编译器在练习题7.27至练习题7.29中,我们介绍了Simpletron机器......