rdma编程
来源:互联网 发布:顺源it 编辑:程序博客网 时间:2024/06/05 02:07
在分布式应用中,用以太网组网往往成为性能的瓶颈,所以需要低时延大带宽,使用RDMA传输协议,能满足低时延要求。目前有两张硬件可以使用RDMA传输,一个是infiniband,一个是RDMA over Ethernet,由于IB的成本较高,所以RoCE成为一种趋势。
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接口接收。
- rdma编程
- RDMA编程技术
- RDMA编程1 建立侦听
- RDMA
- RDMA
- RDMA 简介
- RDMA技术
- TOE,RDMA
- RDMA & RoCE
- RDMA技术
- RDMA技术
- 什么是RDMA?
- RDMA PROTOCAL
- Supporting RDMA on Linux
- Gentoo: NFS/RDMA (Infiniband)
- Introduction to RDMA programming
- RDMA技术分析
- RoCE与RDMA技术
- Spring Session实现Session共享下的坑与建议
- 51nod-【1082 与7无关的数】
- Log4j日志输出详解
- [leetcode]Minimum Window Substring
- linux学习
- rdma编程
- JavaWeb——SSJDBC(struts2,spring,jdbc)框架,正向工程
- javascript检验身份证号码
- 数据结构--C语言
- Java 设计模式 结构型模式 + 案例
- C++ override的用法
- C语言和java中生成随机数的原理和方法
- Python---Numpy
- 14、Java入门—Java IO流之File类的使用