一、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