深入浅出RDMA(远程直接内存访问)
什么是RDMA?
RDMA(Remote Direct Memory Access)是一种网络技术,允许计算机直接从另一台计算机的内存中读取或写入数据,而无需操作系统内核和CPU的介入。这种”绕过”操作系统的数据传输方式带来了显著的性能优势。
RDMA的核心特点
- 零拷贝:数据直接从应用程序内存传输到网卡,不经过内核缓冲区
- 内核旁路:应用程序可以直接访问网络适配器,无需内核参与
- 无CPU参与:数据传输不需要消耗CPU资源
RDMA的主要优势
- 低延迟:通常可达到微秒级延迟
- 高带宽:充分利用网络带宽
- 低CPU占用率:释放CPU资源用于计算任务
RDMA的实现技术
目前主要有三种实现RDMA的技术:
InfiniBand:
- 专为RDMA设计的网络协议
- 需要专用硬件支持
- 提供最高的性能和最低的延迟
RoCE (RDMA over Converged Ethernet):
- 在以太网上实现RDMA
- RoCEv2可在标准IP网络上运行
- 比InfiniBand更具成本效益
iWARP (Internet Wide Area RDMA Protocol):
- 通过TCP实现RDMA
- 支持路由功能
- 适合广域网环境
RDMA的基本概念
1. Queue Pair (QP)
- 由发送队列(SQ)和接收队列(RQ)组成
- 是通信的基本端点单位
2. Completion Queue (CQ)
- 用于通知操作完成状态
- 每个QP可以关联一个或多个CQ
3. Memory Region (MR)
- 描述注册的内存区域
- 必须显式注册才能进行RDMA操作
RDMA操作类型
Send/Receive
- Send:发送端主动推送数据到接收端的缓冲区
- Receive:接收端必须预先发布接收请求
Read
- 从远程节点读取数据到本地内存
Write -将本地数据写入远程节点的内存
Atomic Operations -原子比较交换、原子加法等操作
RDMA编程模型示例(使用ibverbs API)
// IB Verbs基本流程示例:
// 1.获取设备列表
struct ibv_device** dev_list = ibv_get_device_list(NULL);
//2.打开设备
struct ibv_context* context = ibv_open_device(dev_list[0]);
//3.分配保护域
struct ibv_pd* pd = ibv_alloc_pd(context);
//4创建完成队列CQ
struct ibv_cq* cq = ibv_create_cq(context, CQ_SIZE, NULL, NULL,0);
//5创建队列对QP
struct ibv_qp_init_attr qp_init_attr;
memset(&qp_init_attr,0,sizeof(qp_init_attr));
qp_init_attr.send_cq = cq;
qp_init_attr.recv_cq = cq;
qp_init_attr.qp_type = IBV_QPT_RC; //可靠连接类型
struct ibv_qp* qp=ibv_create_qp(pd,&qp_init_attr));
//6注册内存区域MR
struct ibv_mr*mr=ibv_reg_mr(pd,buffer,buffer_size,
IBV_ACCESS_LOCAL_WRITE|
IBV_ACCESS_REMOTE_WRITE);
RDMA应用场景
1.高性能计算(HPC) -MPI通信加速
2.分布式存储系统 -Ceph,NFS over RDMA
3.数据库系统 -Oracle RAC,Microsoft SQL Server
4.金融交易系统 -超低延迟的交易平台
5.AI和大数据处理 -TensorFlow over RDMA,Hadoop over RDAM
6.云数据中心
-AWS EFA,Aliyun eRDAM
内容由零声教学AI助手提供,问题来源于学员提问