基于RDMA的RPC框架(一) 环境搭建

本文详细介绍了在Ubuntu14和18上安装SoftRoce和RDMA驱动的步骤,包括内核编译、用户库安装、依赖库的解决以及相关配置。对于Ubuntu14,需要手动编译内核并启用RDMA软驱,然后安装用户库。而对于Ubuntu18,由于默认支持SoftRoce,仅需安装用户库。整个过程涉及内核配置、gcc版本管理、库文件安装和Java环境配置等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介

二、Ubuntu 14安装SoftRoce

2.1、编译内核

  1. 我使用的是 Ubuntu 14.04,内核版本为:
    在这里插入图片描述

  2. 安装 新版本的内核
    在这里插入图片描述

    git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux

    下载成功:

    Cloning into ‘linux’…
    remote: Counting objects: 5548596, done.
    remote: Compressing objects: 100% (498423/498423), done.
    remote: Total 5548596 (delta 403806), reused 0 (delta 0)
    Receiving objects: 100% (5548596/5548596), 1.03 GiB | 292.00 KiB/s, done.
    Resolving deltas: 100% (4638969/4638969), done.
    Checking out files: 100% (56233/56233), done.

  3. 下载完成后,多出一个linux 文件夹来,进入
    在这里插入图片描述

  4. 在linux目录下,执行 cp /boot/config-4.4.0-142-generic .config,注意这里要拷贝的config- 后面的内容要和自己机器的linux内核版本一致

  5. 执行以下命令:

    apt-get install ncurses-dev
    apt-get install bison
    apt-get install flex
    add-apt-repository ppa:ubuntu-toolchain-r/test #添加gcc源
    apt-get update
    apt-get install gcc-5 g++5
    ls /usr/bin/gcc*
    #将5的优先级设为100
    update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 100
    #原来的4.8也设为100
    update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100
    #切换gcc,切换为5
    update-alternatives --config gcc
    在这里插入图片描述

  6. 执行 make menuconfig

  7. 在打开的界面执行下面的操作
    1、 按“ /”:这将为您打开一个文本字段(搜索)
    2、 输入“ rxe”和“确定”
    3、 按“ 1”转到“以太网RDMA软件(ROCE)驱动程序”
    4、 按“空格”启用“以太网RDMA软件(ROCE)驱动程序”。 您应该在其前面看到“ ”
    5、 使用键盘上的向右箭头转到“保存”,然后按“ Enter”
    6、 按“ Enter”将文件另存为“ .config”文件
    7、 按“ Enter”退出
    8、 回到主界面,选择最下面的kernel hacking
    9、 选择第二行的 Compile-time checks and compiler options
    10、点击 Enter 进入后,修改 Warn for stack frames larger than 的值为4096 (点击enter,在输入框中输入4096),点击ok
    11、向右箭头 选择 save
    12、内核编译时的gdb信息我也关闭了, 即 Kernel hacking > Compile-time checks and compiler options,将“Compile the kernel with debug info”选项去掉
    13、使用右箭头转到“退出”,然后反复按“exit”,直到退出向导。

  8. make –j $(nproc),$(nproc)表示当前机器的线程数目,make -j为并行编译,即用当前机器的内核线程数目的线程来并行make。可能会提示少一些库或者文件,然后去按照错误提示安装对应的库即可。例如我安装了以下几个:

    • apt-get install libelf-dev,解决缺少 gelf.h 头文件
    • apt-get install opensslapt-get install libssl-dev 解决缺少opensslv.h
    • 我这里由于 Makefile 文件的配置,make 的时候会将warning当作error,导致编译退出,所以通过vim编辑 Makefile,找到 KBUILD_CFLAGS 这个选项,添加 KBUILD_CFLAGS += -w 禁用将warning 当作 error
  9. make modules_install

  10. make install

  11. 前两步我没遇到什么坑,所以如果出错,请自己百度。成功之后,重启机器

  12. 重启之后,查看内核信息以及RDMA信息
    在这里插入图片描述

2.2、安装用户库

  1. 克隆用户库:git clone https://github.com/linux-rdma/rdma-core.git,如果连接不上,则执行git clone git://github.com/linux-rdma/rdma-core.git
  2. 安装 cmake,apt-get install cmake
  3. apt-get install valgrind pandoc python-docutils libnl-3-dev libnl-route-3-dev libibverbs-dev libswitch-perl rdmacm-utils ibverbs-utils systemd libudev-dev librdmacm-dev libsystemd-journal0 cython
  4. 进入 rdma_core目录,执行 bash build.sh
  5. 进入build目录,执行 make install

三、Ubuntu 18安装Soft Roce

由于Ubantu 18默认开启了Soft Roce支持,所以不需要重新编译内核,直接安装用户库即可。

  1. 安装 Ubuntu 18,sudo passwd root 设置root用户
  2. apt install git
  3. 安装用户库:apt-get install libibverbs-dev librdmacm-dev rdma-core
  4. apt install vim maven make g++
  5. 安装jdk,下载 jdk (我使用的 jdk1.8),解压 tar -xzvf jdk-8u301-linux-x64.tar.gz -C /usr,编辑 /etc/profile,添加以下环境变量:
export JAVA_HOME=/usr/jdk1.8.0_301   #这里是你自己的jdk所在路径
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}
  1. source /etc/profile,执行 java -version 和 javac,看是否有相应输出
  2. 如果此时显示的是 ubuntu自带的open jdk,则使用如下命令:
sudo update-alternatives --install /usr/bin/java java /usr/jdk1.8.0_301/bin/java 300  
sudo update-alternatives --install /usr/bin/javac javac /usr/jdk1.8.0_301/bin/javac 300  
sudo update-alternatives --install /usr/bin/jar jar /usr/jdk1.8.0_301/bin/jar 300
sudo update-alternatives --install /usr/bin/javah javah /usr/jdk1.8.0_301/bin/javah 300
sudo update-alternatives --install /usr/bin/javap javap /usr/jdk1.8.0_301/bin/javap 300
#切换为自己安装的jdk版本
sudo update-alternatives --config java  
sudo update-alternatives --config javac
  1. 安装 java disni库:git clone https://github.com/zrlio/disni,如果连接不上,则用git clone git://github.com/zrlio/disni

  2. mvn -DskipTests install

  3. cd libdisni

  4. apt-get install autoconf automake libtool

  5. apt-get install libffi-dev

  6. ./autoprepare.sh

  7. ./configure --with-jdk=$JAVA_HOME
    在这里插入图片描述

  8. make install,如果提示缺少 jni.h 和 jni_mod.h 头文件,则执行以下命令:

    1. cp /usr/jdk1.8.0_301/include/jni.h /usr/include/
    2. cp /usr/jdk1.8.0_301/include/linux/jni_md.h /usr/include/
      在这里插入图片描述
  9. export LD_LIBRARY_PATH=/usr/local/lib

  10. cd ../target,从libdisni目录 进入disni目录下的target

  11. 启动 soft-roce ,首先 rxe_cfg start,再执行 rxe_cfg add ens33,注意最后的网卡名要和自己本机的网卡一致

  12. 执行 rxe_cfg status,显示如下:
    在这里插入图片描述

  13. java -cp disni-2.1-jar-with-dependencies.jar:disni-2.1-tests.jar com.ibm.disni.examples.SendRecvServer -a 192.168.220.139,这里的ip填写自己的ip地址

  14. java -cp disni-2.1-jar-with-dependencies.jar:disni-2.1-tests.jar com.ibm.disni.examples.SendRecvClient -a 192.168.220.139,注意 ip地址是服务器的ip

  15. 显示如下,则表示成功。
    在这里插入图片描述

引用

error: Can’t find expat.h. 缺libexpat1-dev库

sudo apt-get install libexpat1-dev
1
No package ‘pciaccess’ found


sudo apt-get install libpciaccess-dev
1
2
3
No package ‘libxml-2.0’ found

  apt-get install libxml2-dev
1
error: bison not found

sudo apt-get install bison
1
flex not found

sudo apt-get install flex
1
No module named mako

sudo apt-get install python-mako
1
No package ‘xcb-composite’ found
No package ‘xcursor’ found
No package ‘cairo-xcb’ found

sudo apt-get install libxcb-shm0-dev
sudo apt-get install xcb
sudo apt-get install libxcursor-dev
sudo apt-get install  libcairo2-dev
<think>好的,用户让我介绍下如何画RDMA框架原理图。首先,我需要确认自己对RDMA的理解是否正确,然后再思考如何用图示来表达它的框架原理。RDMA,即远程直接内存访问,是种技术,允许计算机直接从另台计算机的内存中读取或写入数据,而无需操作系统的介入,这样可以减少延迟和CPU开销。通常用于高性能计算和数据中心。 接下来,用户想要框架原理图,可能需要展示RDMA的关键组成部分以及数据流动的方式。我需要回忆RDMA的基本架构,包括网卡(RNIC)、队列对(QP)、完成队列(CQ)、内存区域(MR)等概念。同时,可能涉及到的协议如InfiniBand、RoCE或iWARP,这些是否需要体现在框架图中? 然后,考虑用户可能的背景。他们可能是学生、工程师或研究人员,对网络或高性能计算感兴趣。用户可能希望原理图能够清晰展示RDMA的工作流程,以及各组件之间的关系。是否需要分层次来展示,比如硬件层、驱动层、应用层? 还需要考虑如何用中文解释这些概念,并确保图示的各个部分准确无误。比如,队列对(QP)包括发送队列和接收队列,完成队列用于通知操作完成,内存区域是注册的内存块,确保安全访问。另外,RDMA操作的类型,如SEND、WRITE、READ,是否需要标注在图中? 可能用户没有详细说明需要哪种类型的原理图,是逻辑架构还是物理连接图。根据常见的框架图,逻辑架构可能更合适,展示各软件和硬件组件之间的交互。例如,应用层调用API,通过动词接口(Verbs)与RNIC通信,RNIC处理数据传输,绕过CPU和操作系统。 还要注意是否需要对比传统网络通信和RDMA的区别,比如零拷贝、内核旁路等特性,这些是否需要在图中以某种形式表现。比如,传统路径经过内核协议栈,而RDMA直接通过RNIC访问内存,减少数据拷贝次数。 最后,总结出RDMA框架的主要组成部分,并用文字描述如何绘制这个示意图,可能需要分步骤说明每个部分的位置和功能,确保用户能够根据描述重现图表。同时,检查是否有遗漏的关键点,比如错误处理、内存注册的重要性,或者不同RDMA实现协议的区别是否需要提及。 可能的误区是过于复杂化图表,或者遗漏了关键组件。需要平衡简洁性和全面性,让读者目了然,同时涵盖核心要素。此外,使用正确的术语和符合中文习惯的表达方式,确保用户理解。</think>以下是**RDMA(远程直接内存访问)框架原理图**的绘制要点及分步解析,帮助您理解其核心机制: --- ### **RDMA框架核心组件** 绘制原理图时需体现以下关键模块: 1. **RNIC(RDMA网卡)** - 硬件核心,负责协议封装、数据传输和内存直接访问 - 标注支持协议:`InfiniBand`、`RoCE`、`iWARP` 2. **队列对(QP, Queue Pair)** - 每个通信端点包含个QP,分为: - **发送队列(SQ)**:存储待发送的操作请求 - **接收队列(RQ)**:存储待接收的数据缓冲区信息 - 示例结构: ```plaintext QP = SQ + RQ |-> Work Request (WR) 操作类型:SEND/WRITE/READ ``` 3. **完成队列(CQ, Completion Queue)** - 用于通知操作完成状态 - 通过`轮询(Polling)`或`事件(Event)`机制获取结果 4. **内存区域(MR, Memory Region)** - 应用程序注册的受保护内存块 - 需标注`虚拟地址→物理地址→RNIC访问权限`的映射关系 --- ### **二、RDMA数据传输流程** 原理图中需体现**零拷贝**和**内核旁路**特性: 1. **传统网络通信路径**(对比用虚线表示) $$ \text{应用数据} \rightarrow \text{内核缓冲区} \rightarrow \text{协议栈处理} \rightarrow \text{网卡} $$ 2. **RDMA直接路径**(实线加粗表示) $$ \text{应用内存} \xrightarrow{\text{直接访问}} \text{RNIC} \rightarrow \text{网络} $$ --- ### **三、示意图绘制步骤** 1. **绘制两端主机** - 标注为`Host A`和`Host B`,通过RNIC连接 2. **主机内部结构** - **应用层**:标注应用程序和API(如`libibverbs`) - **内存区域**:用方框表示已注册的MR,标注虚拟/物理地址 - **队列结构**:绘制QP(SQ/RQ)和CQ的关联关系 3. **数据流箭头** - 从Host A的SQ指向Host B的RQ - 完成通知从CQ返回应用层 4. **关键特性标注** - 在图中空白处添加说明: - 零拷贝(Zero-Copy) - 内核旁路(Kernel Bypass) - 传输协议(如RoCE v2) --- ### **四、简化示例图** ``` +-------------------+ RNIC +-------------------+ | Host A |<----(Direct Memory Access)--->| Host B | | | | | | +-------------+ | | +-------------+ | | | Application | | | | Application | | | +------|------+ | | +------|------+ | | | Verbs API | | Verbs API | +------v------+ | | +------v------+ | | | QP (SQ/RQ) | | | | QP (SQ/RQ) | | | +------|------+ | | +------|------+ | | | | | | | | +------v------+ | | +------v------+ | | | Memory (MR) | | | | Memory (MR) | | | +-------------+ | | +-------------+ | +-------------------+ +-------------------+ ``` --- ### **五、技术优势标注** 在图中补充说明: - **低延迟**:绕过操作系统和协议栈 - **高吞吐**:支持大规模并行数据传输 - **CPU卸载**:由RNIC直接处理数据传输 如果需要更详细的协议分层图(如RoCE基于UDP/IP的封装),可进步扩展网络协议栈部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值