RDMA基础知识

RDMA有一套成熟的开源软件实现,内核代码肯定是开源的,用户态libuverbs.so库,源码位于https://github.com/linux-rdma/rdma-core

 RDMA的核心优势之一就是绕过了内核里的网络协议栈直接进行数据收发,相当于将网络协议栈卸载到了RDMA网卡上。网络协议栈组包、几次数据拷贝肯定会消耗主机的CPU资源,RDMA网卡只需要拿到应用层数据包的地址长度信息,就可以自行拉取数据、组包发送。

我们会说一个设备是RDMA设备,或者VIRTIO设备、NVME设备,但其实RDMA和VIRTIO/NVME不是一个层面的内容。RDMA其实是一整套协议栈,是两个用户之间的全链路通信,它是为了实现两个用户之间的数据通信,规定了各种操作语义、异常处理、拥塞控制等。RDMA不会限制网卡与主机之间的通信格式,这一部分是各个厂商自己定义的。所以RDMA对标网络协议栈或内核块设备层更加合适。RDMA的厂商自定义驱动可以对标VIRTIO协议/NVME协议。

不管是VIRTIO/RDMA/NVME,所有的数据通信都离不开两部分,控制通道的基础准备工作和数据通道的高速数据通信。

控制通道对性能的要求不会很高,主要是协商好初始配置、准备好队列,让数据通道没有负担的进行高速通信。

数据通道的实现离不开高性能队列,具体的实现又离不开Queue Entry[数据首地址、长度]、通知机制[DoorBell、Polling/中断模式]这些基础实现。在这些基础元素基础上,又结合各自应用的不同、性能优化、异常处理等,发展出各自的队列协议,落足到细节上处处尽显小心机。VIRTIO的Split/Packed Queue、NVME的SQ/CQ、RDMA的SQ/RQ/CQ。

对于RDMA来说,QP是一个非常灵活的概念,可支持几万几十万个QP。阿里的RDMA支持64K个QP。QP随着应用动态创建和删除,比VIRTIO更加灵活。

RDMA协议称为Infiniband,包含QP和CQ,每个QP包含一个发送队列和一个接收队列。每个发送/接收队列都必须指向一个完成队列CQ,但是CQ可以是共享的,多个发送/接收队列可以共享一个CQ。

SQ/RQ与CQ,就类似于VIRTIO的avail ring与used ring。思路是一样的,只是名称和细节不同。

RDMA网卡的队列数量很多,网卡为每个队列都要分配一个QP Context,每个CQ分配一个CQ Context,简称为QPC和CQC,来管理和使用各个队列。里面包含基础通信需要的队列基地址、队列深度、生产者消费者指针,以及其他与RDMA协议相关的大量数据,比如QP Number、PSN。

1、MLNX5的QPC和CQC包含哪些内容,在内核代码中可以大概看到它的一部分内容,在/include/linux/mlx5/mlx5_ifc.h文件中,定义了内核关于QPC和CQC的关键命令格式数据,下发给设备侧创建QP和CQ。比如mlx5_ifc_qpc_bits结构体和mlx5_ifc_cqc_bits结构体。这两个结构体是用来按bit赋值的,所以它们按照bit来定义的,其中每个字节实际对应一个bit。

这些创删QP的管理命令也是通过控制队列下发给网卡,具体的实现在mlx5_cmd_exec接口中。

2、Amazon的EFA卡,QPC和CQC的内容,同样可以从下发的管理命令来查看,drivers/infiniband/hw/efa/efa_com_cmd.h。不过EFA卡下发的内容相对比较简单。而且EFA只支持RDMA的UD传输模式。

3、rdma 的uverbs命令各种参数解析,对于建联过程的各种QP参数有比较详细的说明,可以辅助理解:

https://www.rdmamojo.com/2013/01/12/ibv_modify_qp/

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值