一:首先根据系统发行版本下载对应的驱动,下载地址如下:

http://www.mellanox.com/page/products_dyn?product_family=26&mtag=linux_sw_drivers

本次下载的驱动版本为:MLNX_OFED_LINUX-1.5.3-4.0.42-sles11-x86_64.tgz

二:添加针对当前内核的IB驱动

1.把下载好的mellanox驱动解压缩

linux:~ # tar xzvf MLNX_OFED_LINUX-1.5.3-4.0.42-sles11-x86_64.tgz

linux:~ # cd MLNX_OFED_LINUX-1.5.3-4.0.42-sles11-x86_64/

linux:~/MLNX_OFED_LINUX-1.5.3-4.0.42-sles11-x86_64# ll

total 228

-rw-r--r-- 1 root root            7 May  1  2013.arch

-rw-r--r-- 1 root root           13 May  1  2013.mlnx

-rw-r--r-- 1 root root           72 May  1  2013.supported_kernels

drwxr-xr-x 2 root root        12288 May  1  2013RPMS

drwxr-xr-x 8 root root         4096 May  1  2013docs

drwxr-xr-x 5 2666 messagebus   4096 Apr 17 2013 firmware

-rwxr-xr-x 1 root root        11234 May  1  2013mlnx_add_kernel_support.sh

-rwxr-xr-x 1 root root       161517 May  1  2013mlnxofedinstall

drwxr-xr-x 2 root root         4096 May  1  2013repodata

drwxr-xr-x 2 root root         4096 May  1  2013src

-rwxr-xr-x 1 root root         9790 May  1  2013uninstall.sh

2.查看当前驱动所支持的内核版本

linux:~/MLNX_OFED_LINUX-1.5.3-4.0.42-sles11-x86_64# cat .supported_kernels

2.6.27.19-5-debug

2.6.27.19-5-default

2.6.27.19-5-trace

2.6.27.19-5-xen

3.查看当前系统内核版本

linux:~/MLNX_OFED_LINUX-1.5.3-4.0.42-sles11-x86_64# uname -r

2.6.32.12-0.7-default

注:由以上可知下载的默认驱动不支持当前的内核版本

4.添加针对当前内核版本的IB驱动

◆在编译之前首先安装gcc编译环境和kernel开发包

linux:~/MLNX_OFED_LINUX-1.5.3-4.0.42-sles11-x86_64# zypper install gcc gcc-c++

libstdc++-devel kernel-default-devel

◆添加针对当前内核版本的驱动

linux:~/MLNX_OFED_LINUX-1.5.3-4.0.42-sles11-x86_64#./mlnx_add_kernel_support.sh -m /root/MLNX_OFED_LINUX-1.5.3-4.0.42-sles11-x86_64 -v

注:完成后生成的驱动文件在/tmp目录下

linux:~/MLNX_OFED_LINUX-1.5.3-4.0.42-sles11-x86_64# ls -l /tmp/MLNX_OFED_LINUX-1.5.3-4.0.42-sles11sp1-x86_64.tgz

-rw-r--r-- 1 rootroot 238440971 Dec 17 04:43/tmp/MLNX_OFED_LINUX-1.5.3-4.0.42-sles11sp1-x86_64.tgz

◆安装驱动

linux:/tmp # pwd

/tmp

linux:/tmp # tar xzvf MLNX_OFED_LINUX-1.5.3-4.0.42-sles11sp1-x86_64.tgz

linux:/tmp # cd MLNX_OFED_LINUX-1.5.3-4.0.42-sles11sp1-x86_64/

linux:/tmp/MLNX_OFED_LINUX-1.5.3-4.0.42-sles11sp1-x86_64# ./mlnxofedinstall

注:如果系统缺少libgfortran43,在安装的时候会提示以下信息(最好是安装,不安装也行,只是不能运行openshmem和openmpi_gcc)

Warning: libgfortran43 rpm is required to runopenshmem

libgfortran43 is available on SLES11 SDK DVD

Warning: libgfortran43 rpm is required to run openmpi_gcc

libgfortran43 is available on SLES11 SDK DVD

◆最后启动openibd服务

linux:~ #/etc/init.d/openibd start

linux:~ #chkconfig openibd on

Mellanox的RDMA是基于ROCE协议的,因此需要物理层保证可靠传输,不能丢包。为此交换机需要支持DCB, PFC等流控技术。这样子系统一下子就复杂了,为了简化系统,决定不使用交换机,把服务器之间用光纤直连。好在我只有3台服务器,刚好可以连起来,1台对2台即可。

ubuntu14.04系统居然自带了mellanox XC3的驱动,这让我很惊奇,作为普通网卡用这已经可以工作了。但我要用的是RDMA,因此决定还是重新装一下驱动。

  • 步骤1:去mellanox官网上找驱动 
    这个过程可以用两个词形容,大海捞针,中彩票。 网站上内容很多,各种文章也很多,但是没有哪个是教你step by step就能工作的,能下载的软件也很多,也不知道哪个驱动是给那种卡用的,关键是,下错了你也能装上,只是运行是不正常而已。比如,我就先下载到了mlnx-en-3.3-1.0.0.0.tgz, 装上后TCP正常工作没问题,RDMA不能用。然后从各种官网的网页里面的各种方法乱试,又找到一个MLNX_OFED_LINUX-3.3-1.0.4.0-ubuntu14.04-x86_64.tgz, 这个才对了。

大概mellanox的人都很清楚这些区别,但对我一个新手,这太不友好了。

  • 步骤2: rping, ib_xxxx_lat/bw测试 
    这一步其实是和第1步合并执行的,装完了驱动总要试试能不能工作。能工作才说明装对了。

  • 步骤3:测试我自己的rdma程序 
    我的程序工作原理是这样的:

    1. server启动,等待client连接
    2. client 用RDMA_SEND把本地的一个buffer的rkey, raddress发送给server
    3. server收到后,用RDMA_READ,读取client的数据

1和2都执行成功了,3遇到错误,检查completion 时wr里面的vendor error, 是138。开始求助mellanox的技术支持这个错误是什么,对方说是:indicates InvReq Nack. 又追问Nack是什么,说是not ACK。

我的代码之前是用softIWARP调试通过了的,所以认为没有太多低级错误,以为这样的vendor error能很快解决,但实际上厂家也给不出任何意见。还是得自己慢慢调试。又是从其网站上的各种文章里面的各种方法挨个试验,其中包括了把roce 模式改成v2,

# echo "options mlx4_core roce_mode=2" > /etc/modprobe.d/mlx4_core.conf
  • 这个对·vendor error 138·没有帮助,但对后面的调试造成了困难

后来发现ib_read_lat程序能正常工作,基于这个线索开始找我的代码和ib_read_lat代码的区别。要不怎么说开源好呢,还有最后的绝招可以用,看代码啊!

其实也没那么容易,ib_read_lat的代码很多,不是一下子能找出关键点,只能一点一点把ib_read_lat的代码往下减,果然,减到一定程度,出现了和我同样的错误,再仔细看这减掉的部分,错误其实很简单,在调用rdma_connect函数时,要设置connection param的responder_resources等几个参数

struct rdma_conn_param cm_params;
cm_params.responder_resources = priv_data.hsqsize;
cm_params.initiator_depth = priv_data.hsqsize; cm_params.retry_count = 7; cm_params.rnr_retry_count = 7; rdma_connect(evt->id, &cm_params);
  • 这里不得不第一次吐槽rdma_cm,或者ofed,或者mellanox的错误信息,太不清晰了,这么简单的错误,如果有明确的错误指示,何至于让我浪费几天的时间。
  • 步骤4: 继续运行我的程序 
    这里先交代一下,前一步调试问题时,为缩小问题的来源范围,开始在单个节点上调试,即: server, client都运行在同一个机器上。

我的程序需要运行在不同的机器上,在节点间进行RDMA传输(这个想必是自然的,没人在同一个节点上吃饱了撑的用RDMA)。结果发现, 联不通啊!!

又换回ib_send_bw这个工具开始测试,发现同样联不通,问题是:

ethernet_read_keys: Couldn't read remote address
Unable to read to socket/rdam_cm
Failed to close connection between server and client Trying to close this side resources
  • 各种google,和官网的文章乱看,重装驱动,无果。 然后忽然想起了我自己的笔记,这里插播广告:居家旅行, 编程调试必备之良器, evernote, 你值得拥有, 发现了我在前面把一个机器改成了RoCE v2模式!

既然如此,那就都用v2模式,问题解决!

  • 步骤5:重复步骤4, 运行我的程序 
    cao! 还是不行,换了个新说法:
# ib_send_bw -R 192.168.a.b
Received 10 times ADDR_ERRORUnable to perform rdma_client function Unable to init the socket connection

先说明一下不重要的,这里的测试使用了-R参数,表示使用rdma_cm进行连接管理,这也是我的程序需要用的,前面的步骤测试时没有使用这个参数。

可以想象我有多么崩溃,不过我觉得不用找厂家了,厂家也提供不了什么,其实有经验的还是一线的工作者,所以认识的很多人,都被上游厂家挖走做AE/FAE去了。这次我先看了我的evernote,所以浪费时间不多。在去年的笔记里找到了下面的这个配置:

# mount -t configfs none /sys/kernel/config
# cd /sys/kernel/config/rdma_cm
# mkdir mlx4_0
# cd mlx4_0
# echo RoCE V2 > default_roce_mode

RoCE可以在以太网上运行RDMA协议,时延比普通以太网可以提升30%以上,也可以支持双协议栈,同时用TCP和RDMA,编程过程类似IB。

有两张建链方式,一种是通过RDMA_CM建链,一种是先通过TCP建链,通过tcp通道交换双方的设备信息,QP信息,简历RDMA链路,然后关闭tcp链路,第二种更常用。

RDMA编程流程

1)初始化RDMA设备

ibv_get_device_list()获取使用可以使用RDMA传输的设备个数,可以根据ibv_get_device_list结构中的dev_name找到需要使用的设备;

struct ibv_device **ibv_get_device_list(int *num_devices);

ibv_open_device()打开设备,获取设备句柄;

ibv_query_device()查询设备,获取设备属性

ibv_query_port()查询设备端口属性

如果类型为Ethernet,bv_query_gid()获取设备GID,用于交换双方信息使用

2)创建QP信息

ibv_alloc_pd()用于创建qp接口的参数

ibv_create_cq()创建CQ,一个CQ可以完成的CQE的个数,CQE与队列个数有关,队列多,CQE个数就设置多,否则设置少,一个CQ可以对应一个QP,也可以两个CQ对应一个QP。一个CQ包含发送和接收队列。

ibv_create_qp()创建QP。类似tcp的socket

3)注册MR信息

ibv_reg_mr()注册网卡内存信息,把操作系统物理内存注册到网卡

4)交换QP信息

ibv_modify_qp()交换双方QP信息,修改QP信息状态级

Client端:先创建QP,修改状态级reset到INIT,修改INIT到RTR,然后发送到server端,server端创建QP,修改状态机有INIT到RTR,然后发送到客户端,客户端修改状态机有RTR到RTS,发送到server端,server端修改状态机有RTR到RTS,这样rmda链路简建立成功。

5)发送和接收

ibv_post_recv()接收消息接口

ibv_post_send()发送消息接口

ibv_poll_cq()用于查询cq队列是否有事件产生,如果有调用recv接口接收。

 

转载于:https://www.cnblogs.com/klb561/p/9074227.html

mellanox RDMA RoCE相关推荐

  1. 【RDMA】mellanox RDMA网卡驱动安装和查看状态

    目录 1. 基础知识 一.诊断工具--翻译中 2. 驱动安装 3.配置IP 4. 性能测试 5. 其他问题 RDMA .InfiniBand.IB卡.IB驱动的关系 问题记录 2. 驱动安装 下载驱动 ...

  2. 简单理解RDMA RoCE

    对啊RDMA RoCE理解: 就是说RDMA网卡已经把协议栈(UDP/TCP) 这些协议栈全部offload到RDMA网卡的ASIC芯片上来实现了(硬化).而且在本机上用户buffer到网卡buffe ...

  3. Ubuntu 20.04 安装Mellanox RDMA网卡驱动与带宽/时延测试

    Mellanox RDMA网卡驱动安装 1 RDMA驱动安装 2 时延与带宽测试 1 RDMA驱动安装 # 1. get OFED # https://cn.mellanox.com/products ...

  4. RDMA Mellanox官方使用VPI verbs API的例子

    来源:Mellanox RDMA文档中的样例 编译库的需求:libibverbs 编译参数:GCC <文件名> -o service -libverbs 运行方式: 1. 有IB网络支持: ...

  5. 一周一论文(翻译 总结)—— [DSN 18] RDMC A Reliable RDMA Multicast for Large Objects :一个面向大型对象的可靠的RDMA广播框架

    目录 Abstract 1.Introduction 2. Background On RDMA 3. High level RDMC summary 4. System Design 4.1 Ext ...

  6. 19. RDMA之iWARP Soft-iWARP

    转自:https://zhuanlan.zhihu.com/p/449189540 说到RDMA,自然绕不开现在流行的三大协议:Infiniband.RoCE以及iWARP.相信读者读过本专栏前面的文 ...

  7. 【RDMA】19. RDMA之iWARP Soft-iWARP

    [RDMA]RDMA 学习资料总目录_bandaoyu的博客-CSDN博客SavirRDMA 分享1. RDMA概述https://blog.csdn.net/bandaoyu/article/det ...

  8. Revisiting Network Support for RDMA

    重新审视RDMA的网络支持 本文为SIGCOMM 2018会议论文. 笔者翻译了该论文.由于时间仓促,且笔者英文能力有限,错误之处在所难免:欢迎读者批评指正. 本文及翻译版本仅用于学习使用.如果有任何 ...

  9. 【RDMA】IRN|Revisiting Network Support for RDMA-(重新审视RDMA的网络支持)

    目录 重新审视RDMA的网络支持 Abstract (摘要) 1 Introduction (引言) 2 Background (背景) 2.1 Infiniband RDMA and RoCE (I ...

最新文章

  1. 我是如何做软件测试项目的?
  2. 0046-简单的分段函数(二)
  3. div超出部分滚动并且隐藏滚动条
  4. Git入门教程(1)
  5. SecureCRTSecureFX_HH_x64_7.0.0.326 crt部署项目到服务器
  6. jstl 获取 javascript 定义的变量_前端开发大牛完整总结出了JavaScript 难点 +最新web前端开发教程...
  7. Knight Moves(信息学奥赛一本通-T1257)
  8. Vue的watch和computed属性
  9. Python爬虫中最重要、最常见、一定要熟练掌握的库
  10. SIM: 基于搜索的超长行为序列上的用户兴趣建模
  11. ZZW_shell脚本中的调用MYSQL传参及注意的问题
  12. android 监听 h5 window,H5嵌入APP后,通过window.WebViewJavascriptBridge原生APP与H5之间交互...
  13. CCF201604-4 游戏(100分)
  14. Web版记账本开发记录(五)
  15. 游戏中按概率播放某个音效简单c++实现
  16. Python+QT+Selenium制作在线视频播放器
  17. Python学多久能接单赚钱?按照这套路线学习,30天内就可以!
  18. VNA测量时如何制作一个TRL校准夹具
  19. windows下bison安装使用
  20. 2019年最全的大数据学习大纲总结,持续更新.....

热门文章

  1. 汽车车系 API数据接口
  2. 《Effective Java》中文版第3版 读书笔记
  3. 学历造假!AI公司CEO冒充中科大少年班校友!清华、斯坦福名校经历全造假
  4. linux打开xshell传文件,Xshell拖拽文件直接上传至Linux
  5. 舒尔特注意力训练网页版
  6. it行业 平均年龄_中国IT富豪平均年龄48岁
  7. 艾默生质量流量计小故障的处理方法
  8. Pygame从0实战8(泡泡小游戏)
  9. 电池电芯生产工艺及流程
  10. 冲量在线荣获2021年度长三角智慧城市建设典型实施案例奖,助力长三角一体化、高质量发展