Datenlord | Rust实现RDMA异步编程(一):基于epoll实现RDMA 异步操作

作者:王璞 / 后期编辑: 张汉东

RDMA是一套高性能网络协议栈,多用于高性能计算、高性能存储领域。RDMA的library是用C实现的,但是没有很好用的Rust的binding,不方便Rust开发者使用。于是我们正在封装一层符合Rust风格、便于Rust开发者使用的RDMA Rust binding。特别的,异步编程是近几年很受关注的编程方式,用Rust异步编程来实现IO操作,可以避免操作系统的进程上下文切换,提高性能,而且Rust的异步编程框架也在逐步成熟和完善。本系列文章探讨下如何用异步的方式实现RDMA的操作。本文先讨论下如何基于Linux的epoll机制实现RDMA异步操作,后续的文章再探讨如何用Rust异步编程来实现RDMA异步操作。

RDMA操作简介


RDMA的编程模型是基于消息的方式来实现网络传输,并且用队列来管理待发送的消息和接收到的消息。RDMA的网络传输相关操作基本上都是跟队列相关的操作:比如把要发送的消息放入发送队列,消息发送完成后在完成队列里放一个发送完成消息,以供用户程序查询消息发送状态;再比如接收队列里收到消息,也要在完成队列里放个接收完成消息,以供用户程序查询有新消息要处理。

 

由上面的描述可以看出RDMA的队列分为几种:发送队列Send Queue (SQ),接收队列Receive Queue(RQ),和完成队列Completion Queue (CQ)。其中SQ和RQ统称工作队列Work Queue (WQ),也称为Queue Pair (QP)。此外,RDMA提供了两个接口,ibv_post_sendibv_post_recv,由用户程序调用,分别用于发送消息和接收消息:

  • 用户程序调用ibv_post_send把发送请求Send Request (SR)插入SQ,成为发送队列的一个新的元素Send Queue Element (SQE);
  • 用户程序调用ibv_post_recv把接收请求Receive Request (RR)插入RQ,成为接收队列的一个新元素Receive Queue Element (RQE)。

SQE和RQE也统称工作队列元素Work Queue Element (WQE)。

当SQ里有消息发送完成,或RQ有接收到新消息,RDMA会在CQ里放入一个新的完成队列元素Completion Queue Element (CQE),用以通知用户程序。用户程序有两种同步的方式来查询CQ:

  • 用户程序调用ibv_cq_poll来轮询CQ,一旦有新的CQE就可以及时得到通知,但是这种轮询方式很消耗CPU资源;
  • 用户程序在创建CQ的时候,指定一个完成事件通道ibv_comp_channel,然后调用ibv_get_cq_event接口等待该完成事件通道来通知有新的CQE,如果没有新的CQE,则调用ibv_get_cq_event时发生阻塞,这种方法比轮询要节省CPU资源,但是阻塞会降低程序性能。

关于RDMA的CQE,有个需要注意的地方:对于RDMA的Send和Receive

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达坦科技DatenLord

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值