【RDMA】librdmacm库和连接建立过程

翻译:rdma_cm - RDMA通信管理器。

概述:rdma_cm是用于建立RDMA传输上的通信的管理器。

说明:RDMA CM是一个用于建立可靠连接和不可靠数据报数据传输的通信管理器。它为建立连接提供了一个RDMA传输中立的接口。该API基于套接字,但为队列对(QP)的语义进行了调整:通信必须通过特定的RDMA设备进行,并且数据传输是基于消息的。

RDMA CM仅提供RDMA API的通信管理(连接建立/拆除)部分。它与libibverbs库定义的verbs API配合使用。libibverbs库提供了发送和接收数据所需的接口。

客户端操作:此部分提供了通信的主动端(或客户端)的基本操作概述。一般的连接流程如下:

  1. rdma_create_event_channel:创建接收事件的通道。

  2. rdma_create_id:分配一个rdma_cm_id,类似于socket。

  3. rdma_resolve_addr:获取本地RDMA设备以到达远程地址。

  4. rdma_get_cm_event:等待RDMA_CM_EVENT_ADDR_RESOLVED事件。

  5. rdma_ack_cm_event:确认事件。

  6. rdma_create_qp:为通信分配一个QP。

  7. rdma_resolve_route:确定到达远程地址的路由。

  8. rdma_get_cm_event:等待RDMA_CM_EVENT_ROUTE_RESOLVED事件。

  9. rdma_ack_cm_event:确认事件。

  10. rdma_connect:连接到远程服务器。

  11. rdma_get_cm_event:等待RDMA_CM_EVENT_ESTABLISHED事件。

  12. rdma_ack_cm_event:确认事件。

  13. 在连接上执行数据传输。

  14. rdma_disconnect:撤销连接。

  15. rdma_get_cm_event:等待RDMA_CM_EVENT_DISCONNECTED事件。

  16. rdma_ack_cm_event:确认事件。

  17. rdma_destroy_qp:销毁QP。

  18. rdma_destroy_id:释放rdma_cm_id。

  19. rdma_destroy_event_channel:释放事件通道。

用于在节点之间建立不可靠数据报(UD)通信的过程几乎相同。但是,QPs之间不会形成实际的连接,因此不需要断开连接。

虽然此示例显示客户端发起断开连接,但连接的任一方都可以发起断开连接。

服务器操作:此部分提供了通信的被动端(或服务器端)的基本操作概述。一般的连接流程如下:

  1. rdma_create_event_channel:创建接收事件的通道。

  2. rdma_create_id:分配一个rdma_cm_id,类似于socket。

  3. rdma_bind_addr:将本地端口号设置为监听的端口号。

  4. rdma_listen:开始监听连接请求。

  5. rdma_get_cm_event:等待带有新的rdma_cm_id的RDMA_CM_EVENT_CONNECT_REQUEST事件。

  6. rdma_create_qp:在新的rdma_cm_id上为通信分配一个QP。

  7. rdma_accept:接受连接请求。

  8. rdma_ack_cm_event:确认事件。

  9. rdma_get_cm_event:等待RDMA_CM_EVENT_ESTABLISHED事件。

  10. rdma_ack_cm_event:确认事件。

  11. 在连接上执行数据传输。

  12. rdma_get_cm_event:等待RDMA_CM_EVENT_DISCONNECTED事件。

  13. rdma_ack_cm_event:确认事件。

  14. rdma_disconnect:撤销连接。

  15. rdma_destroy_qp:销毁QP。

  16. rdma_destroy_id:释放已连接的rdma_cm_id。

  17. rdma_destroy_id:释放监听的rdma_cm_id。

  18. rdma_destroy_event_channel:释放事件通道。

返回值:成功返回0,错误返回-1。如果函数以异步方式运行,则返回值为0表示成功启动操作。操作仍然可能以错误完成;用户应该检查相关事件的状态。如果返回值为-1,则errno将包含有关失败原因的其他信息。

先前版本的库对于与ENOMEM、ENODEV、ENODATA、EINVAL和EADDRNOTAVAIL代码有关的某些情况会返回-errno并且不设置errno。希望检查这些代码并与先前版本的库兼容的应用程序必须在返回代码小于-1时手动将errno设置为返回代码的负值。

相关推荐
gwf21612 分钟前
Completion Queue(CQ)与中断处理:轮询、中断聚合与错误码 —— 面向AI集群的驱动级深度剖析
驱动开发·性能调优·pcie·rdma·ai集群·中断聚合·cq
gwf2161 天前
内核RDMA子系统(ib_core)架构与核心数据结构:从驱动视角解构数据通路
linux内核·rdma·网卡驱动·mlx5·gpudirect·ib_core·内核架构
gwf2163 天前
Verbs性能优化实战:Inline/Signaled/批处理/NUMA亲和全攻略
rdma·numa·io_uring·内核驱动·mlx5·verbs·hugepage
业余程序员plus4 天前
RDMA-HCA-Mellanox网卡UAR与门铃 (二)
rdma·mellanox·wqe·mmio·doorbell·uar·blueflame
业余程序员plus4 天前
RDMA-HCA-Mellanox网卡架构与初始化 (一)
pcie·rdma·hca·icm·mellanox·mlx5·command queue
Eloudy13 天前
开源 gpunetio examples 01 解析 gpunetio_verbs_put_bw
gpu·fpga·rdma·roce·doca
Eloudy14 天前
GPUNetIO开源实现与FPGA的 RoCEv2 通信延迟实验
gpu·fpga·rdma·roce·doca
gwf21614 天前
AI训练RDMA性能Profiling:瓶颈定位与调优方法论
芯片设计·rdma·nccl·拥塞控制·ai集群·rnic·gpudirect
Eloudy15 天前
RDMA 乒乓示例:CX5 <-> CX6 DX(QSFP28 直连)
rdma·roce·doca
Eloudy15 天前
cpu rdma 与 gpunetio 的关系
gpu·rdma·roce·doca