摘要
InfiniBand(IB)以其高带宽、低延迟和内核旁路特性,在现代数据中心和高性能计算领域占据重要地位。本文基于一个完整的C语言程序,深入剖析如何利用InfiniBand Verbs接口和MAD(Management Datagram)管理数据报,在两台直连的IB节点之间实现全双工文件传输。程序实现了发送方主动推送文件、接收方被动接收,并内置了传输带宽测量功能。文章将依次介绍InfiniBand核心概念、程序架构、关键代码逻辑以及编译运行方法,旨在为开发者提供一份可落地的RDMA编程参考。
1. 引言
传统TCP/IP协议栈在传输大量数据时,CPU需要参与数据拷贝、协议封装和中断处理,成为性能瓶颈。RDMA(Remote Direct Memory Access)允许网卡直接读写应用程序内存,几乎不占用CPU资源。InfiniBand作为RDMA的主流实现之一,提供了一套称为libibverbs的用户态编程接口。
本文程序展示了以下RDMA核心操作:
- 设备打开、保护域(PD)、完成队列(CQ)和队列对(QP)的创建
- 内存注册(MR)以允许网卡安全访问
- 使用SEND/RECV操作进行双向数据传输
- 通过MAD(管理数据报)在无连接模式下交换QP建立所需的LID、QPN、PSN等参数
- 实现发送窗口和接收缓冲池,支持大文件分块传输
- 精确测量端到端传输吞吐量