最近业务需要,接触到ceph相关的技术。 Rdma是ceph里面的一个概念。 以下分析是纯粹个人根据经验进行理解,具体原理最好是看librdma的代码。

功能:

在大文件拷贝时,dma控制器接管cpu对拷贝过程的控制,减少数据从用户空间到内核空间的层级,拷贝完成后异步的方式通知cpu。

效果:

显著降低高负荷时,cpu性能下降,数据拷贝延迟问题。

应用范围:

需要夸节点拷贝大量数据的业务场景。

如果我去从0实现一个rdma方案,应该是如下的流程:

  • (1)购买NIO网卡,nio网卡里面有一个透传控制器,和send , receive, complete三个高速缓存队列。
  • (2)用librdma驱动模块进行定制修改。
  • (3)如果librdma修改幅度比较大,可自行编写linux kernel driver。 需要涉及2个硬件的驱动(dma控制器的驱动、网卡驱动) 关于搜索dma的源码,用make meonconfig, 用/dma,进行搜索定位到具体的源码,然后拷贝一个源码出来,里面关于dma 硬件dst设置,notify的2个地方进行拦截,拦截后数据流通过NIO的网卡驱动发送到peer node的网卡缓冲区。 peer node通过dma 把网卡缓冲区的数据拷贝到目的地址后,本节点发出dma complete notifdy event。 注意:rdma肯定是并不会建立socket线路,而是最原始的网卡底层数据(我认为是放置在进入tcpip之前,也就是在osi模型的物理层实现跨界点数据的透传)。

模型图:

论 rdma 的实现原理_golang