rdma-core
是一个开源项目,为远程直接内存访问(RDMA)提供用户空间的支持。它包括 RDMA 设备的驱动程序、库和工具,旨在简化 RDMA 应用的开发和部署。
基础知识参考博文:
一文带你了解什么是RDMA
RDMA 高性能架构基本原理与设计方案
RDMA之RoCE & Soft-RoCE_software roce
目录:
目录:
一、什么是rdma-core?
1.1 主要组成部分
1.2 功能特点
二、安装和使用
2.1 下载安装
2.2 编译
三、rdma-core中README详解
3.1 文档原件
3.2 原文解读
3.2.1 RDMA Core 用户空间库和守护进程
3.2.2 在 CentOS 7 和 Amazon Linux 2 上构建
四、RDMA-Core 库的功能和 API
4.1 官方文档
4.2 API 文档
五、学习示例代码
5.1 tests目录
5.2 build/bin 包含示例程序
5.3 build/lib 包含共享库
六、进行实践项目
6.1 项目目标
6.2 项目步骤
1. 环境准备
2. 编写 RDMA 服务器
3. 编写 RDMA 客户端
4. 运行项目
5. 测试和验证
6.3 项目扩展
七、 深入学习性能调优
八、 参与社区
8.1 RDMA Mailing Lists
8.2 Stack Overflow
8.3 GitHub
8.4 Reddit(可能需要VPN)
8.5 OpenFabrics Alliance (OFA)
8.5 Linux Kernel Mailing List (LKML)
8.6 RDMAmojo
8.7 RDMA Consortium
九、 参考书籍和资源
十、 实践和反馈
一、什么是rdma-core?
rdma-core
是 RDMA 应用开发的重要基础,提供了丰富的 API 和工具,支持多种 RDMA 设备和协议。它的高性能和低延迟特性使其成为现代数据中心和高性能计算环境中的关键技术。通过 rdma-core
,开发者可以方便地构建高效的 RDMA 应用程序。
1.1 主要组成部分
1. 库和 API:rdma-core
提供了多种 API,用于管理 RDMA 设备和执行 RDMA 操作。这些 API 支持用户空间应用程序与 RDMA 硬件之间的直接交互。
2. 工具:包含多个命令行工具,用于检测和管理 RDMA 设备。例如,ibv_devinfo
可用于查询 RDMA 设备的信息,ib_write_bw
和 ib_read_lat
等工具用于性能测试和基准测试。
3. 示例代码:rdma-core
提供了一些示例应用程序,帮助开发者理解如何使用 RDMA API 进行数据传输和连接管理。
1.2 功能特点
1. 高性能: RDMA 允许数据在网络中的两个主机之间直接传输,而无需经过操作系统内核,从而显著降低延迟和 CPU 占用率。
2. 多种传输协议支持: 包括 InfiniBand、RoCE(RDMA over Converged Ethernet)和 iWARP 等。
3. 灵活性: 为开发者提供了灵活的接口,支持多种 RDMA 操作,如写、读、发送和接收等。
4. 多种设备支持: 支持多种 RDMA 硬件设备,使其能够在不同的网络环境中使用。
二、安装和使用
2.1 下载安装
在大多数 Linux 发行版中,可以使用包管理工具安装 rdma-core
。例如,在 Ubuntu 上,可以使用以下命令:
sudo apt-get install rdma-core
InfiniBand 驱动程序,如果你使用的是 InfiniBand 硬件,请确保系统中已加载了相关的内核模块,例如 ib_core
、ib_ipoib
、ib_uverbs
等。可以使用以下命令检查:
lsmod | grep ib_
如果没有看到这些模块,可能需要加载它们:
sudo modprobe ib_core
sudo modprobe ib_ipoib
sudo modprobe ib_uverbs
也可以从源代码编译安装:
git clone https://github.com/linux-rdma/rdma-core.git
cd rdma-core
2.2 编译
执行./build.sh指令,目的是自动化构建 rdma-core
项目。这个脚本通常封装了一系列的命令,用于编译和安装项目,简化了手动执行多个步骤的过程。这将会构建 rdma-core
并生成所需的库文件。
./build.sh
将自己编写的 RDMA 程序放入构建目录,假设你的程序名为 client.c
,将其复制到构建后的 lib
目录,使用 gcc 编译 client.c,确保链接到 libibverbs 库。可以使用以下命令:
cp ../../client.c ./
gcc client.c -o client -g -L. -Wl,-rpath=./ -libverbs
-o client
指定输出的可执行文件名为client
。-g
选项用于生成调试信息。-L.
指定当前目录为库文件搜索路径。-Wl,-rpath=./
设置运行时库搜索路径为当前目录。
三、rdma-core中README详解
3.1 文档原件
[![Build Status](https://dev.azure.com/ucfconsort/rdma-core/_apis/build/status/linux-rdma.rdma-core?branchName=master)](https://dev.azure.com/ucfconsort/rdma-core/_build/latest?definitionId=2&branchName=master)# RDMA Core Userspace Libraries and DaemonsThis is the userspace components for the Linux Kernel's drivers/infiniband
subsystem. Specifically this contains the userspace libraries for the
following device nodes:- /dev/infiniband/uverbsX (libibverbs)- /dev/infiniband/rdma_cm (librdmacm)- /dev/infiniband/umadX (libibumad)The userspace component of the libibverbs RDMA kernel drivers are included
under the providers/ directory. Support for the following Kernel RDMA drivers
is included:- bnxt_re.ko- efa.ko- erdma.ko- iw_cxgb4.ko- hfi1.ko- hns-roce.ko- irdma.ko- ib_qib.ko- mana_ib.ko- mlx4_ib.ko- mlx5_ib.ko- ib_mthca.ko- ocrdma.ko- qedr.ko- rdma_rxe.ko- siw.ko- vmw_pvrdma.koAdditional service daemons are provided for:- srp_daemon (ib_srp.ko)- iwpmd (for iwarp kernel providers)- ibacm (for InfiniBand communication management assistant)# BuildingThis project uses a cmake based build system. Quick start:```sh
$ bash build.sh
```*build/bin* will contain the sample programs and *build/lib* will contain the
shared libraries. The build is configured to run all the programs 'in-place'
and cannot be installed.### Debian Derived```sh
$ apt-get install build-essential cmake gcc libudev-dev libnl-3-dev libnl-route-3-dev ninja-build pkg-config valgrind python3-dev cython3 python3-docutils pandoc
```Supported releases:* Debian 9 (stretch) or newer
* Ubuntu 16.04 LTS (xenial) or newer### Fedora, CentOS 8```sh
$ dnf builddep redhat/rdma-core.spec
```NOTE: Fedora Core uses the name 'ninja-build' for the 'ninja' command.### openSUSE```sh
$ zypper install cmake gcc libnl3-devel libudev-devel ninja pkg-config valgrind-devel python3-devel python3-Cython python3-docutils pandoc
```## Building on CentOS 7, Amazon Linux 2Install required packages:```sh
$ yum install cmake gcc libnl3-devel libudev-devel make pkgconfig valgrind-devel
```Developers on CentOS 7 or Amazon Linux 2 are suggested to install more modern
tooling for the best experience.CentOS 7:```sh
$ yum install epel-release
$ yum install cmake3 ninja-build pandoc
```Amazon Linux 2:```sh
$ amazon-linux-extras install epel
$ yum install cmake3 ninja-build pandoc
```NOTE: EPEL uses the name 'ninja-build' for the 'ninja' command, and 'cmake3'
for the 'cmake' command.# UsageTo set up software RDMA on an existing interface with either of the available
drivers, use the following commands, substituting `<DRIVER>` with the name of
the driver of your choice (`rdma_rxe` or `siw`) and `<TYPE>` with the type
corresponding to the driver (`rxe` or `siw`).```
# modprobe <DRIVER>
# rdma link add <NAME> type <TYPE> netdev <DEVICE>
```Please note that you need version of `iproute2` recent enough is required for the
command above to work.You can use either `ibv_devices` or `rdma link` to verify that the device was
successfully added.# Reporting bugsBugs should be reported to the <linux-rdma@vger.kernel.org> mailing list
In your bug report, please include:* Information about your system:- Linux distribution and version- Linux kernel and version- InfiniBand hardware and firmware version- ... any other relevant information* How to reproduce the bug.* If the bug is a crash, the exact output printed out when the crashoccurred, including any kernel messages produced.# Submitting patchesSee [Contributing to rdma-core](Documentation/contributing.md).# Stable branchesStable versions are released regularly with backported fixes (see Documentation/stable.md)
The current minimum version still maintained is 'v30.X'
3.2 原文解读
以下是对提供的 RDMA-Core 项目说明的中文翻译和讲解
3.2.1 RDMA Core 用户空间库和守护进程
这是 Linux 内核中 drivers/infiniband
子系统的用户空间组件。具体而言,这包含了以下设备节点的用户空间库:
/dev/infiniband/uverbsX
(libibverbs)/dev/infiniband/rdma_cm
(librdmacm)/dev/infiniband/umadX
(libibumad)
libibverbs 的用户空间组件包含在 providers/
目录下,支持以下内核 RDMA 驱动程序:
- bnxt_re.ko
- efa.ko
- erdma.ko
- iw_cxgb4.ko
- hfi1.ko
- hns-roce.ko
- irdma.ko
- ib_qib.ko
- mana_ib.ko
- mlx4_ib.ko
- mlx5_ib.ko
- ib_mthca.ko
- ocrdma.ko
- qedr.ko
- rdma_rxe.ko
- siw.ko
- vmw_pvrdma.ko
此外,还提供了以下服务守护进程:
- srp_daemon(ib_srp.ko)
- iwpmd(用于 iwarp 内核提供程序)
- ibacm(用于 InfiniBand 通信管理助手)
1. 构建
该项目使用基于 CMake 的构建系统。快速开始:
$ bash build.sh
build/bin 将包含示例程序,build/lib 将包含共享库。构建配置为“就地”运行所有程序,无法安装。
2. Debian 系列
$ apt-get install build-essential cmake gcc libudev-dev libnl-3-dev libnl-route-3-dev ninja-build pkg-config valgrind python3-dev cython3 python3-docutils pandoc
支持的版本:
- Debian 9(stretch)或更新版本
- Ubuntu 16.04 LTS(xenial)或更新版本
3. Fedora、CentOS 8
$ dnf builddep redhat/rdma-core.spec
注意:Fedora Core 使用名称 'ninja-build' 作为 'ninja' 命令。
4. openSUSE
$ zypper install cmake gcc libnl3-devel libudev-devel ninja pkg-config valgrind-devel python3-devel python3-Cython python3-docutils pandoc
3.2.2 在 CentOS 7 和 Amazon Linux 2 上构建
1. 安装所需软件包:
$ yum install cmake gcc libnl3-devel libudev-devel make pkgconfig valgrind-devel
建议 CentOS 7 或 Amazon Linux 2 开发者安装更现代的工具,以获得最佳体验。
CentOS 7:
$ yum install epel-release $ yum install cmake3 ninja-build pandoc
Amazon Linux 2:
$ amazon-linux-extras install epel $ yum install cmake3 ninja-build pandoc
注意:EPEL 使用名称 'ninja-build' 作为 'ninja' 命令,并且 'cmake3' 作为 'cmake' 命令。
2. 使用:
要在现有接口上设置软件 RDMA,使用以下命令,替换 <DRIVER>
为所选驱动程序的名称(rdma_rxe
或 siw
)以及 <TYPE>
为与驱动程序对应的类型(rxe
或 siw
)。
# modprobe <DRIVER> # rdma link add <NAME> type <TYPE> netdev <DEVICE>
请注意,您需要一个足够新的 iproute2
版本,以使上述命令正常工作。
您可以使用 ibv_devices
或 rdma link
来验证设备是否成功添加。
3. 报告错误:
错误应报告给 linux-rdma@vger.kernel.org 邮件列表。请在您的错误报告中包含:
-
有关您的系统的信息:
- Linux 发行版和版本
- Linux 内核和版本
- InfiniBand 硬件和固件版本
- 其他任何相关信息
-
如何重现该错误。
-
如果错误导致崩溃,请提供崩溃发生时打印的确切输出,包括任何产生的内核消息。
4. 提交补丁:
请参阅 [Contributing to rdma-core](Documentation/contributing.md) 。
5. 稳定分支
稳定版本定期发布,并包含回溯修复(请参见 Documentation/stable.md)。当前仍在维护的最低版本为 'v30.X'。
四、RDMA-Core 库的功能和 API
4.1 官方文档
Documentation 目录:在仓库中的 Documentation
目录下,您可以找到更详细的文档,包括 API 文档和使用指南。
以下是您列出的 RDMA-Core 项目中的文档文件的简要介绍:
1. azure-pipelines.md:该文件通常包含有关如何在 Azure Pipelines 环境中构建和测试 RDMA-Core 项目的指南和配置说明。
2. contributing.md:此文档提供有关如何为 RDMA-Core 项目贡献代码或文档的指南,包括提交补丁、报告错误和参与开发过程的规则和建议。
3. ibsrpdm.md:该文件涉及到 IB-SRP (InfiniBand SCSI RDMA Protocol) 的实现和使用说明,具体内容可以包含配置、操作和使用 IB-SRP 的示例。
4. librdmacm.md:该文档描述 `librdmacm` 库的功能和 API,提供有关如何使用该库进行 RDMA 连接管理的详细信息,包括函数说明和使用示例。
5. release.md:该文件包含关于发布 RDMA-Core 项目的信息,通常包括版本发布的计划、版本历史、更新日志等。
6. stable.md:该文档提供有关项目稳定版本的信息,包括当前维护的稳定版本、更新策略和长期支持版本的信息。
7. testing.md:此文档描述 RDMA-Core 的测试策略和实践,包括如何编写和运行测试,确保代码质量和功能正确性的方法。
8. versioning.md:该文件解释项目的版本控制策略,包括版本号的格式、如何管理和发布版本更新的规则。
9. CMakeLists.txt:这是 CMake 构建系统的配置文件,定义了构建项目所需的源文件、库依赖和构建选项。
10. ibacm.md:该文档介绍 `ibacm`(InfiniBand Communication Manager)的功能和使用方法,包括如何配置和使用该守护进程进行 InfiniBand 连接管理。
11. libibverbs.md:此文档详细说明 `libibverbs` 库的功能和 API,提供了使用该库进行 RDMA 操作的详细指南和示例。
12. pyverbs.md:该文件可能介绍了 `pyverbs`,这是一个 Python 绑定库,允许在 Python 中使用 RDMA 功能,文档可能包含安装方法和 API 说明。
13. rxe.md:该文档介绍 RXE(RDMA over Ethernet)的实现,描述如何在 Ethernet 网络上使用 RDMA,包括配置和使用说明。
14. tag_matching.md:该文件可能涉及标签匹配的实现或使用说明,具体内容可以包括 RDMA 连接中如何使用标签来管理和匹配请求。
15. udev.md:此文档描述如何使用 `udev` 设备管理器来处理 RDMA 设备的创建设定,可能包含规则和配置示例。
通过这些文档,开发者可以更好地理解和使用 RDMA-Core 项目中的各个组件和功能。如果需要深入了解某个特定文档的内容,可以直接查看相关的 Markdown 文件。
4.2 API 文档
Doxygen 文档:RDMA-Core 通常会使用 Doxygen 生成 API 文档。如果在本地构建 RDMA-Core,可以在构建目录中找到生成的 HTML 格式的 API 文档。运行以下命令以生成:
doxygen Doxyfile
然后打开 html/index.html
来查看文档。
注意: 当出现以下错误时:
确保您已安装 Doxygen。如果没有,请根据您的操作系统安装 Doxygen:
sudo apt-get install doxygen
再次执行:
doxygen -g Doxyfile
成功生成了 Doxygen 配置文件
Doxyfile
在终端中,确保您仍然在
rdma-core
目录下,然后运行以下命令生成文档doxygen Doxyfile
当我们打开 index.html 文档后:
五、学习示例代码
在 RDMA-Core 的 GitHub 仓库中,查看示例代码。这些代码通常提供了使用 RDMA 的基本用法和应用场景。运行和修改示例程序,尝试理解其工作原理。
5.1 tests目录
tests
这个目录通常包含用于测试 RDMA 功能的示例代码,虽然主要用于测试,但也可以作为学习和参考的示例。
这些文件大多是与 RDMA 和 Mellanox (现在的 NVIDIA) 的 mlx5 驱动程序相关的测试和基础代码。以下是对这些文件的简要介绍:
args_parser.py
:可能用于解析命令行参数的实用工具,帮助在运行测试时传入不同的参数。
base.py
:通常是一个基础类或模块,其他模块可能会继承或依赖于它,提供通用的功能或定义。
base_rdmacm.py
:与 RDMA 连接管理(RDMA Connection Manager)相关的基础功能模块。
cuda_utils.py
:与 CUDA 相关的实用工具,可能涉及到 GPU 相关的 RDMA 操作。
efa_base.py
:与 EFA (Elastic Fabric Adapter) 相关的基础实现。
mlx5_base.py
:Mellanox mlx5 设备的基础功能实现。
mlx5_prm_structs.py
:定义 mlx5 驱动程序中的数据结构,可能是与硬件通信所需的结构体。
rdmacm_utils.py
:提供 RDMA Connection Manager 的辅助功能。
run_tests.py
:用于运行所有测试的脚本文件。测试文件(如
test_cq.py
,test_qp.py
,test_mlx5_*.py
等):这些文件通常是单元测试或集成测试,测试不同功能模块的正确性,包括:
test_cq.py
:测试完成队列 (Completion Queue) 的功能。test_qp.py
:测试队列对 (Queue Pair) 的功能。test_mlx5_devx.py
:测试 mlx5 设备的 DevX 接口。test_cuda_dmabuf.py
:测试 CUDA 直接内存缓冲区的功能。test_flow.py
:测试流量管理功能。
utils.py
:包含一些通用的辅助函数,以便在多个模块中重用。
__init__.py
:标识这个目录是一个 Python 包,可能会初始化包的某些功能或导入。这些文件通常用于开发和测试 RDMA 驱动程序,以确保其功能的正确性和性能。如果你想深入了解某个特定文件的功能,可以查看它的源代码,或者查看相关的文档和注释。
5.2 build/bin 包含示例程序
这些代码通常提供了使用 RDMA 的基本用法和应用场景。运行和修改示例程序,尝试理解其工作原理。
示例代码是 rdma-core
项目中提供的工具和脚本,用于管理和测试 RDMA(远程直接内存访问)设备和网络。
- bitmap_test: 测试位图操作的工具。
- check_lft_balance.pl: 检查逻辑转发表(LFT)平衡的 Perl 脚本。
- cmtime: 用于 RDMA 连接管理(CM)时间测试的工具。
- dump_fts: 转储转发表(FTS)的工具。
- dump_lfts.sh: 转储逻辑转发表(LFT)的 Shell 脚本。
- dump_mfts.sh: 转储多播转发表(MFT)的 Shell 脚本。
- ibacm: InfiniBand 地址转换服务(ACM)工具。
- ibaddr: 显示 InfiniBand 设备的地址信息。
- ibcacheedit: 编辑 InfiniBand 缓存信息的工具。
- ibccconfig: InfiniBand 链路层配置工具。
- ibccquery: 查询 InfiniBand 链路层配置的工具。
- ibfindnodesusing.pl: 查找使用特定端口的节点的 Perl 脚本。
- ibhosts: 显示 InfiniBand 网络中的主机信息。
- ibidsverify.pl: 验证 InfiniBand 设备 ID 的 Perl 脚本。
- iblinkinfo: 显示 InfiniBand 链路信息的工具。
- ibnetdiscover: 发现 InfiniBand 网络拓扑的工具。
- ibnodes: 显示 InfiniBand 网络中的节点信息。
- ibping: 用于 InfiniBand 设备之间 ping 测试的工具。
- ibqueryerrors: 查询 InfiniBand 设备错误信息的工具。
- ibroute: 显示 InfiniBand 路由信息的工具。
- ibrouters: 显示 InfiniBand 网络中的路由器信息。
- ibsendtrap: 发送 InfiniBand 陷阱(trap)的工具。
- ibstat: 显示 InfiniBand 设备状态的工具。
- ibstatus: 显示 InfiniBand 设备详细状态的工具。
- ibswitches: 显示 InfiniBand 网络中的交换机信息。
- ibsysstat: 显示 InfiniBand 系统状态的工具。
- ibtracert: 用于 InfiniBand 网络路径跟踪的工具。
- ibv_asyncwatch: 监视 InfiniBand Verbs 异步事件的工具。
- ibv_devices: 列出可用 InfiniBand Verbs 设备的工具。
- ibv_devinfo: 显示 InfiniBand Verbs 设备信息的工具。
- ibv_rc_pingpong: 用于 InfiniBand Verbs RC(可靠连接)模式 ping-pong 测试的工具。
- ibv_srq_pingpong: 用于 InfiniBand Verbs 共享接收队列(SRQ)模式 ping-pong 测试的工具。
- ibv_uc_pingpong: 用于 InfiniBand Verbs UC(不可靠连接)模式 ping-pong 测试的工具。
- ibv_ud_pingpong: 用于 InfiniBand Verbs UD(不可靠数据报)模式 ping-pong 测试的工具。
- ibv_xsrq_pingpong: 用于 InfiniBand Verbs 扩展共享接收队列(XSRQ)模式 ping-pong 测试的工具。
- iwpmd: InfiniBand 工作负载分区管理工具。
- mcm_rereg_test: 多播连接管理(MCM)重新注册测试工具。
- mckey: 多播密钥管理工具。
- perfquery: 查询 InfiniBand 性能参数的工具。
- rdma_client: RDMA 客户端工具。
- rdma_rename: RDMA 命名空间重命名工具。
- rdma_server: RDMA 服务器工具。
- rdma_xclient: RDMA 扩展客户端工具。
- rdma_xserver: RDMA 扩展服务器工具。
- rcopy: RDMA 远程复制工具。
- riostream: RDMA 流工具。
- rping: RDMA ping 工具。
- rstream: RDMA 流测试工具。
- run_tests.py: 运行测试的 Python 脚本。
- sainfo: SA(服务属性)信息工具。
- smpdump: 转储 SA(服务属性)信息的工具。
- smpquery: 查询 SA(服务属性)信息的工具。
- srp_daemon: SCSI RDMA 协议(SRP)守护进程。
- srdump: 转储 SR(服务请求)信息的工具。
- srt_daemon: SR(服务请求)守护进程。
- srt_server: SR(服务请求)服务器工具。
- srt_test: SR(服务请求)测试工具。
- srt_util: SR(服务请求)实用工具。
- srt_xclient: SR(服务请求)扩展客户端工具。
- srt_xserver: SR(服务请求)扩展服务器工具。
- testleaks: 内存泄漏测试工具。
- ucmatose: UCM(用户模式连接管理)工具。
- udpong: UDP ping 工具。
- umad_compile_test: UMAD(用户模式管理)编译测试工具。
- umad_reg2: UMAD(用户模式管理)注册工具。
- umad_register2: UMAD(用户模式管理)注册工具。
- umad_sa_mcm_rereg_test: UMAD(用户模式管理)SA(服务属性)MCM(多播连接管理)重新注册测试工具。
- vendstat: 供应商状态工具。
这些工具和脚本涵盖了 InfiniBand 和 RDMA 网络的配置、管理、测试和故障排除等多个方面。你可以根据具体需求选择合适的工具来使用。
5.3 build/lib 包含共享库
这些库文件是与 rdma-core
及其相关组件一起安装的,用于支持远程直接内存访问(RDMA)和 InfiniBand(IB)等高性能网络的操作。
libibacmp.so
: InfiniBand Address/Path Record Cache Manager Protocol(IB ACM)库。用于地址和路径记录缓存管理。libbnxt_re-rdmav34.so
: Broadcom NetXtreme RDMA over Converged Ethernet (RoCE) 驱动库。libcxgb4-rdmav34.so
: Chelsio Communications T4/T5/T6 RDMA 驱动库。libefa-rdmav34.so
,libefa.so
,libefa.so.1
,libefa.so.1.3.53.0
: Elastic Fabric Adapter(EFA)库。libhfi1verbs-rdmav34.so
: Intel Omni-Path HFI1 驱动库。libhns-rdmav34.so
,libhns.so
,libhns.so.1
,libhns.so.1.0.53.0
: Huawei HNS(HiSilicon Network Subsystem)库。libibmad.so
,libibmad.so.5
,libibmad.so.5.3.53.0
: InfiniBand 管理数据(MAD)库,用于构建和解析 MAD 消息。libibnetdisc.so
,libibnetdisc.so.5
,libibnetdisc.so.5.1.53.0
: InfiniBand 网络发现库。libibumad.so
,libibumad.so.3
,libibumad.so.3.2.53.0
: 用户模式的管理数据(UMAD)库。libibverbs.so
,libibverbs.so.1
,libibverbs.so.1.14.53.0
: InfiniBand Verbs 库,用于 RDMA 设备的低级接口。libipathverbs-rdmav34.so
: QLogic InfiniPath 驱动库。libmana-rdmav34.so
,libmana.so
,libmana.so.1
,libmana.so.1.0.53.0
: Microsoft Azure Network Adapter(MANA)库。libmlx4-rdmav34.so
,libmlx4.so
,libmlx4.so.1
,libmlx4.so.1.0.53.0
: Mellanox ConnectX-3 驱动库。libmlx5-rdmav34.so
,libmlx5.so
,libmlx5.so.1
,libmlx5.so.1.24.53.0
: Mellanox ConnectX-4/5 驱动库。libmthca-rdmav34.so
: Mellanox InfiniBand HCAs 驱动库。libocrdma-rdmav34.so
: Emulex OneConnect RDMA 驱动库。libqedr-rdmav34.so
: QLogic QED 驱动库。librdmacm.so
,librdmacm.so.1
,librdmacm.so.1.3.53.0
: RDMA 连接管理库,用于建立 RDMA 连接。librspreload.so
: 用于 RDMA 的预加载库。librxe-rdmav34.so
: Soft RoCE 驱动库。libsiw-rdmav34.so
: Software iWARP 驱动库。libvmw_pvrdma-rdmav34.so
: VMware Paravirtual RDMA 驱动库。- pkgconfig: 包含库的
pkg-config
文件,这些文件提供了编译和链接时所需的配置信息。
如何使用这些库 :
这些库提供了多种功能,用于开发和管理 RDMA 和 InfiniBand 网络应用。你可以根据项目需求选择特定的库进行开发,例如:
1. 开发 RDMA 应用:
- 使用
libibverbs
和librdmacm
库开发高性能 RDMA 应用。 - 示例程序可以使用这些库来建立 RDMA 连接、发送和接收数据。
2. 网络管理和监控:
- 使用
libibmad
、libibumad
和libibnetdisc
库进行网络管理和监控。 - 可以编写脚本或程序来查询网络状态、配置网络设备。
3. 驱动开发和优化:
- 使用特定的驱动库(如
libmlx5
,libcxgb4
,libhns
等)进行驱动开发或优化。 - 可以根据硬件特性调整配置,提升性能。
这些库的详细使用方法可以参考相应的 man
手册页或库的文档。通过灵活运用这些库,你可以构建功能强大的 RDMA 和 InfiniBand 网络应用程序。
六、进行实践项目
创建自己的 RDMA 应用程序。可以开始编写一个简单的客户端-服务器模型,通过 RDMA 进行数据传输。尝试实现更复杂的功能,例如数据一致性、错误处理和性能优化。
后续会将实践小项目博客链接放到此处,感兴趣的大佬也可以自己尝试的做一些,在此先提供一部分思路:
6.1 项目目标
构建一个简单的 RDMA 客户端-服务器应用,客户端向服务器发送数据并接收响应。
6.2 项目步骤
1. 环境准备
确保你已经安装了必要的依赖项,包括
rdma-core
工具和库。2. 编写 RDMA 服务器
使用
rdma_server
工具作为 RDMA 服务器。你可以编写一个简单的脚本来启动服务器。将以上内容保存为
rdma_server.sh
并赋予执行权限:3. 编写 RDMA 客户端
使用
rdma_client
工具作为 RDMA 客户端。你可以编写一个简单的脚本来连接到服务器并发送数据。将以上内容保存为
rdma_client.sh
并赋予执行权限:4. 运行项目
首先启动 RDMA 服务器:
然后在另一台机器或另一个终端窗口启动 RDMA 客户端:
其中,
<SERVER_IP>
是服务器的 IP 地址,<SERVER_PORT>
是 RDMA 服务器监听的端口。5. 测试和验证
通过客户端发送数据到服务器,并观察服务器的响应。你可以通过修改
rdma_server
和rdma_client
工具的参数来调整测试内容和数据量。6.3 项目扩展
你可以根据需要扩展这个项目,例如:
性能测试: 使用
ibv_rc_pingpong
、ibv_srq_pingpong
等工具测试 RDMA 网络的性能。监控和诊断: 使用
ibstat
、ibstatus
、perfquery
等工具监控 RDMA 网络的状态和性能。故障排除: 使用
ibtracert
、ibqueryerrors
等工具进行网络故障排除。通过这种方式,你可以灵活运用
rdma-core
项目中的工具和脚本,构建并扩展你的 RDMA 网络应用和测试项目。
七、 深入学习性能调优
学习 RDMA 的性能特性,如何优化 RDMA 应用程序以获得更好的性能。了解 RDMA 的调试和监控工具。
后续会将此教程以博客形式补充到此处,有想法的大佬也可以自己调试一下
八、 参与社区
加入 RDMA 相关的社区和论坛,参与讨论,向其他开发者学习。关注 RDMA 的最新动态、开发和最佳实践。
8.1 RDMA Mailing Lists
Linux-rdma Mailing List: 这是讨论 Linux 上 RDMA 开发和问题的主要邮件列表。你可以订阅并参与讨论。
- 订阅地址: Linux RDMA and InfiniBand Development
OpenFabrics Alliance Mailing List: OpenFabrics 软件的主要讨论列表。
- 订阅地址: lists.openfabrics.org Mailing Lists
8.2 Stack Overflow
在 Stack Overflow 上,你可以找到许多关于 RDMA 的问题和回答。使用关键词如 "RDMA", "InfiniBand", "ibverbs" 等进行搜索。
- 链接: https://stackoverflow.com
8.3 GitHub
GitHub 上有许多与 RDMA 相关的开源项目。你可以查看项目的 issue 和 pull request,与开发者互动。
- 链接: https://github.com
8.4 Reddit(可能需要VPN)
Reddit 上的 r/networking
和 r/linuxadmin
等子版块有时候会有 RDMA 相关的讨论
- 链接: https://www.reddit.com/r/networking/
- 链接: https://www.reddit.com/r/linuxadmin/
8.5 OpenFabrics Alliance (OFA)
OFA 是一个推动 RDMA 标准和技术发展的组织。其官网上有许多资源和信息。
- 链接: https://www.openfabrics.org
8.5 Linux Kernel Mailing List (LKML)
RDMA 和 InfiniBand 的开发者也经常在 Linux Kernel Mailing List 上讨论相关问题。
- 订阅地址: https://lkml.org
8.6 RDMAmojo
RDMAmojo 是一个专注于 RDMA 技术的博客和社区,提供许多关于 RDMA 的教程和资讯。
- 链接: RDMAmojo - RDMAmojo - blog on RDMA technology and programming by Dotan Barak RDMAmojo
8.7 RDMA Consortium
RDMA Consortium 是一个致力于促进 RDMA 技术发展的组织,提供技术资源和标准。
- 链接: Home
九、 参考书籍和资源
查找关于 RDMA、网络编程和高性能计算的书籍,深入学习相关理论和实践。
在线课程:寻找网络编程或高性能计算相关的在线课程,许多平台上都有相关资源。
文档和书籍:
- 《Infiniband Network Architecture》: 这是一本关于 InfiniBand 技术的深入书籍。
- 《RDMA Aware Networks Programming User Manual》: Mellanox 提供的 RDMA 编程手册,涵盖了 RDMA 编程的基础知识和高级主题。
会议和研讨会
OFA Workshop: 每年举办的 OpenFabrics Alliance 工作坊,汇集了 RDMA 领域的专家和从业者,分享最新的研究和开发进展。
- 链接: https://www.openfabrics.org/index.php/ofa-workshop.html
在线课程和教程:
- Coursera 和 Udemy 等平台上有一些关于高性能计算和网络编程的课程,可能包含 RDMA 相关内容。
通过参与这些社区和论坛,你可以与全球的 RDMA 开发者和专家互动,获取最新的技术信息和开发动态,提高自己的技能和知识。
十、 实践和反馈
在学习过程中,积极进行实践,编写代码并进行测试。寻求反馈,与他人讨论你的实现和遇到的问题。