恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
035、基于CM的RDMA连接建立实战:客户端与服务端
首页
资讯中心
/
035、基于CM的RDMA连接建立实战:客户端与服务端
035、基于CM的RDMA连接建立实战:客户端与服务端
发布时间:2026/9/23 18:26:51
035、基于CM的RDMA连接建立实战:客户端与服务端从一次诡异的连接超时说起上周调试一个分布式存储项目,两台机器之间用RDMA做数据通道。代码逻辑看起来没问题,ibv_create_qp、ibv_modify_qp都返回成功,但客户端就是连不上服务端。抓包一看,CM连接请求根本没发出去。查了半天,发现是CM事件处理线程里调用了sleep——这玩意儿在RDMA的异步事件循环里就是个定时炸弹。今天这篇笔记,就把CM建连的坑和正确姿势一次性说清楚。CM通信模型的核心:别把RDMA当TCP用很多从socket转过来的兄弟容易犯一个错误:以为CM就是RDMA版的socket,connect/accept一套走完就能直接收发。实际上CM只负责连接管理,真正的数据传输靠QP(Queue Pair)。CM建连的本质是交换QP的上下文信息,包括QP号、GID、PKey这些元数据。连接建立后,CM通道基本就退休了,后续数据走的是QP的WQE(Work Queue Element)。CM通信分三步走:服务端监听(rdma_listen)、客户端发起连接(rdma_connect)、服务端确认(rdma_accept)。每一步都涉及异步事件,处理不好就是死锁。服务端:先搭好事件处理的骨架服务端初始化时,最容易被忽略的是事件通道的创建时机。我见过有人先创建QP再创建事件通道,结果事件根本收不到。正确顺序是: