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

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_ERROR
Unable 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接口接收。

 

mellanox RDMA RoCE的更多相关文章

  1. DPDK(mtcp)vs RDMA/ROCE

    0. 缠论: http://52investing.com/ 1. 简书.DPDK: http://www.jianshu.com/p/dcb6ccc83ea52. mTCP 和 DPDK 构造百万千 ...

  2. Revisiting Network Support for RDMA

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

  3. RDMA

    什么是RDMA? 来源 https://blog.csdn.net/u011459120/article/details/78469098 1. 概述 RDMA是Remote Direct Memor ...

  4. QoS in RoCE (zz)

    QoS in RoCE 首页分类标签留言关于订阅2018-03-22 | 分类 Network  | 标签 RDMA  RoCE  ECN  PFC Overview TCP/IP协议栈满足不了现代I ...

  5. QoS in RoCE

    QoS in RoCE 首页分类标签留言关于订阅2018-03-22 | 分类 Network  | 标签 RDMA  RoCE  ECN  PFC Overview TCP/IP协议栈满足不了现代I ...

  6. RDMA技术解析

    文章出处:https://mp.weixin.qq.com/s/pW-tQR4AYr1Gtd4dpHVW7w 摘要:远程直接内存访问(即Remote Direct Memory Access)是一种直 ...

  7. RDMA的原理、传输与Verbs

    RDMA的原理.传输与Verbs   RDMA最早专属于infiniband架构.在网络融合的大趋势下出现的RoCE,使高速.超低延时.极低cpu使用率的RDMA得以部署在目前使用最广泛的以太网上.  ...

  8. RDMA Programming - Base on linux-rdma

    RDMA Programming - Base on linux-rdma 首页分类标签留言关于订阅2017-11-08 | 分类 Network  | 标签 RDMA  RoCE  Linux-RD ...

  9. Linux Soft-RoCE implementation (zz)

    Linux Soft-RoCE implementation 首页分类标签留言关于订阅2017-11-08 | 分类 Network  | 标签 RDMA  RoCE  Linux-RDMA 内核在4 ...

随机推荐

  1. Deep Learning的基本思想

    假设我们有一个系统S,它有n层(S1,…Sn),它的输入是I,输出是O,形象地表 示为: I =>S1=>S2=>…..=>Sn => O,如果输出O等于输入I,即输入I ...

  2. 开发中常用Fel的写法

    直接看代码吧: package javademo; import java.util.HashMap;import java.util.Map; import com.greenpineyu.fel. ...

  3. 应用开发之Linq和EF

    本章简言 上一章笔者对于WinForm开发过程用到的几个知识点做了讲解.笔者们可以以此为开端进行学习.而本章我们来讲一个跟ORM思想有关的知识点.在讲之前让我们想一下关于JAVA的hibernate知 ...

  4. Android 通过findViewById方式创建TabHost

    package org.shuxiang.tabhostsample; import android.os.Bundle; import android.app.ActivityGroup; impo ...

  5. Spring 之注解事务 @Transactional(转载)

    Spring在TransactionDefinition接口中规定了7种类型的事务传播行为, 它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播: 事务传播行为类型 事务传播行为类型 说明 P ...

  6. 制作item和category的mvc视图总结

    View层index.phg 代码: <?php use yii\helpers\Html; use yii\grid\GridView; use yii\widgets\Pjax; use f ...

  7. Sass之一(基础篇)

    源码链接:http://pan.baidu.com/s/1o8M51hCSass 学习Sass之前,应该要知道css预处理器这个东西,css预处理器是什么呢? Css预处理器定义了一种新的语言将Css ...

  8. Exchange NLB 单播和多播模式比较

    一般来说,在NLB的创建时,单网卡多播,双网卡单播. 双网卡单播时,因为主机之间不能互相通信,将设置内网通讯的网卡,也就是群集设置中的心跳. NLB模式 描述 优点 缺点 单播 网卡MAC会被NLB专 ...

  9. iOS 常用框架介绍

    iOS框架介绍      Cocoa Touch   GameKit  实现对游戏中心的支持,让用户能够在线共享他们的游戏相关的信息  iOS设备之间蓝牙数据传输   从iOS7开始过期   局域网游 ...

  10. 模拟Push和Pop动作

    //利用CATransition来作模拟 //模拟Push - (void)pushView:(UIView *)pushView inView:(UIView *)inView { CATransi ...