mellanox RDMA RoCE
一:首先根据系统发行版本下载对应的驱动,下载地址如下:
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程序
我的程序工作原理是这样的:- server启动,等待client连接
- client 用RDMA_SEND把本地的一个buffer的rkey, raddress发送给server
- 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的更多相关文章
- DPDK(mtcp)vs RDMA/ROCE
0. 缠论: http://52investing.com/ 1. 简书.DPDK: http://www.jianshu.com/p/dcb6ccc83ea52. mTCP 和 DPDK 构造百万千 ...
- Revisiting Network Support for RDMA
重新审视RDMA的网络支持 本文为SIGCOMM 2018会议论文. 笔者翻译了该论文.由于时间仓促,且笔者英文能力有限,错误之处在所难免:欢迎读者批评指正. 本文及翻译版本仅用于学习使用.如果有任何 ...
- RDMA
什么是RDMA? 来源 https://blog.csdn.net/u011459120/article/details/78469098 1. 概述 RDMA是Remote Direct Memor ...
- QoS in RoCE (zz)
QoS in RoCE 首页分类标签留言关于订阅2018-03-22 | 分类 Network | 标签 RDMA RoCE ECN PFC Overview TCP/IP协议栈满足不了现代I ...
- QoS in RoCE
QoS in RoCE 首页分类标签留言关于订阅2018-03-22 | 分类 Network | 标签 RDMA RoCE ECN PFC Overview TCP/IP协议栈满足不了现代I ...
- RDMA技术解析
文章出处:https://mp.weixin.qq.com/s/pW-tQR4AYr1Gtd4dpHVW7w 摘要:远程直接内存访问(即Remote Direct Memory Access)是一种直 ...
- RDMA的原理、传输与Verbs
RDMA的原理.传输与Verbs RDMA最早专属于infiniband架构.在网络融合的大趋势下出现的RoCE,使高速.超低延时.极低cpu使用率的RDMA得以部署在目前使用最广泛的以太网上. ...
- RDMA Programming - Base on linux-rdma
RDMA Programming - Base on linux-rdma 首页分类标签留言关于订阅2017-11-08 | 分类 Network | 标签 RDMA RoCE Linux-RD ...
- Linux Soft-RoCE implementation (zz)
Linux Soft-RoCE implementation 首页分类标签留言关于订阅2017-11-08 | 分类 Network | 标签 RDMA RoCE Linux-RDMA 内核在4 ...
随机推荐
- iOS开发之--实现倒计时显示时分秒
这段时间写公司的一个外包项目,需要用到倒计时:需要显示时分秒,通过在网上搜集资料,找到了2中方法,我把这两种方法结合起来,可以很好的满足这个需求: 1.创建一个类继承自UIlabel,用来展示时分秒的 ...
- Activity 5秒 Broadcast 10秒 Service 20秒
第一:什么会引发ANR? 在Android里,应用程序的响应性是由Activity Manager和WindowManager系统服务监视的 .当它监测到以下情况中的一个时,Android就会针对特定 ...
- iOS 8出色的跨应用通信效果:解读Action扩展
本文转载至 http://mobile.51cto.com/iphone-464809.htm 用程序扩展最初于WWDC 2014大会上正式亮相,这是一种将iOS应用程序功能扩展至系统其它组成部分的途 ...
- sessionStorage存储json对象
应用场景: 账单列表中A页面:点击其中的一列,ajax返回的数据在这一页 点击进入账单详情B页面: 因为在A页面已经做过ajax的请求了,所以希望把当前其中的一个数组对象传到B页面中,所以,就考虑到暂 ...
- PAT 甲级 1068 Find More Coins(0,1背包)
1068. Find More Coins (30) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Eva l ...
- CodeForces 639 A
Bear and Displayed Friends time limit per test2 seconds memory limit per test256 megabytes inputstan ...
- Web浏览器导出FTP服务器上的文件
开发思路:1.代码登录ftp服务器下载文件到服务器2.通过web浏览器下载服务器上的文件 using System; using System.Collections; using System.Co ...
- SignalR循序渐进(一)简单的聊天程序
前阵子把玩了一下SignalR,起初以为只是个real-time的web通讯组件.研究了几天后发现,这玩意简直屌炸天,它完全就是个.net的双向异步通讯框架,用它能做很多不可思议的东西.它基于Owin ...
- 基于Django的乐观锁与悲观锁解决订单并发问题的一点浅见
订单并发这个问题我想大家都是有一定认识的,这里我说一下我的一些浅见,我会尽可能的让大家了解如何解决这类问题. 在解释如何解决订单并发问题之前,需要先了解一下什么是数据库的事务.(我用的是mysql数据 ...
- ALV tree标准DEMO
BCALV_TREE_01 ALV 树控制:构建层次树 BCALV_TREE_02 ALV 树控制:事件处理 BCALV_TREE_03 ALV 树控制:使用自己的上下文菜单 BCALV_TREE_0 ...