一、 基本概念
RDMA(Remote Direct Memory Access)网络是一种基于硬件实现的远程内存访问技术,在传输过程中绕过了操作系统的网络协议栈,实现了高效低延迟的数据传输。RDMA与传统网络协议不同,它将数据传输的工作交给网卡(RDMA适配器)完成,而非操作系统的网络协议栈。
例如,使用TCP/IP传输数据时,应用程序通过send()系统调用将数据写入内存缓冲区,然后经由操作系统的网络协议栈通过网卡(NIC,Network Interface Card)将数据发送到网络中。在远程接收端,网络协议栈的工作与发送端相反,最终将数据交给应用程序。
相比之下,RDMA技术完全不需要操作系统的网络协议栈介入数据传输过程,而是通过RDMA适配器将数据直接传输到远程服务器的内存中,实现了零拷贝技术,减少了CPU资源和网络带宽的消耗,降低了网络延迟,提高了网络传输效率。
二、 RDMA网络的应用场景
目前,RDMA技术主要应用在高性能计算(HPC)、云计算、存储系统等领域。
在HPC领域,RDMA被广泛应用于MPI(Message Passing Interface)库中,MPI库是一种高性能计算中广泛使用的并行编程模型,以消息传递的方式进行并行计算。MPI库需要实现消息通信子(Communication Subsystem),在RDMA技术的帮助下,MPI库可以提高程序并行化的效率,并减少进程间通信的延迟。
在云计算环境下,RDMA技术可以实现虚拟机(VM)的高速网络和高性能存储访问。RDMA适配器可以通过虚拟网络,实现虚拟机与物理机的数据传输,同时通过RDMA协议实现虚拟机直接访问SAN(Storage Area Network)存储系统,提高了虚拟机应用程序的性能。
三、 RDMA网络的实现方式
RDMA技术的实现主要由以下3个层次构成。
RDMA适配器层: RDMA适配器是一种支持RDMA技术的网卡。RDMA适配器需要具备以下功能:1)将DMA(Direct Memory Access)数据传输与网络协议栈分离;2)支持零拷贝技术;3)支持IPoIB(InfiniBand over IP)和RoCE(RDMA over Converged Ethernet)等协议。
RDMA通信层: RDMA通信层是RDMA网络传输的核心,它实现了RDMA的网络协议,包括数据传输过程中的连接管理、数据传输、包序列化和重传等。RDMA通信层还提供了IBV(InfiniBand Verbs)API和RoCE API,用于应用程序进行RDMA网络编程。
//使用IBV创建一个RDMA通信端点 #includestruct ibv_context *ctx = ibv_open_device(dev->ib_ctx); struct ibv_pd *pd = ibv_alloc_pd(ctx); struct ibv_cq *cq = ibv_create_cq(ctx, CQ_SIZE, NULL, NULL, 0); struct ibv_qp_init_attr qp_init_attr{}; qp_init_attr.send_cq = cq; qp_init_attr.recv_cq = cq; qp_init_attr.qp_type = IBV_QPT_RC; qp_init_attr.cap.max_send_wr = MAX_SEND_WR; qp_init_attr.cap.max_recv_wr = MAX_RECV_WR; qp_init_attr.cap.max_send_sge = MAX_SR_SGE; qp_init_attr.cap.max_recv_sge = MAX_RR_SGE; struct ibv_qp *qp = ibv_create_qp(pd, &qp_init_attr);
应用层: 应用层是RDMA网络的最上层,用户可以使用IBV API进行RDMA网络编程,实现高效低延迟的数据传输。
//使用IBV API发送RDMA读取请求 #includestruct ibv_sge send_sge{}; send_sge.addr = local_buffer_addr; send_sge.length = length; send_sge.lkey = lkey; struct ibv_send_wr send_wr{}; send_wr.sg_list = &send_sge; send_wr.num_sge = 1; send_wr.opcode = IBV_WR_RDMA_READ_WITH_IMM; send_wr.send_flags = IBV_SEND_SIGNALED; send_wr.wr.rdma.remote_addr = remote_buffer_addr; send_wr.wr.rdma.rkey = rkey; struct ibv_send_wr *bad_send_wr; ibv_post_send(qp, &send_wr, &bad_send_wr);
四、 RDMA网络的优势和挑战
优势: RDMA网络技术采用了先进的零拷贝技术和削减了内核态和数据包处理间接性的通信方式,因此具有如下优势。
1)低延迟:由于完全绕过操作系统的内核态,RDMA网络通信的延迟非常低,最小可达到几微秒级别。
2)高吞吐:RDMA网络可以通过多通道和多队列实现并行的消息传递和数据传输,大大提高了数据传输的吞吐量。
3)较高的CPU利用率:RDMA网络使用零拷贝技术,减少了CPU的消耗,提高了CPU的利用率。
挑战: RDMA网络技术在应用过程中还面临如下挑战。
1)技术门槛较高:RDMA通信层的实现比较复杂,需要深入理解RDMA网络的协议和底层硬件,因此对开发者的技术要求较高。
2)成本相对较高:相对于TCP/IP协议等传统协议,RDMA网络的适配器、交换机、以及布线成本较高,需要较大的开销。
五、 总结
RDMA网络技术是当前高性能计算、云计算、存储等领域中最重要的技术之一,它采用先进的零拷贝技术和高效的数据传输方式,大大提高了数据传输的效率和网络的性能。虽然RDMA技术面临技术门槛高、成本高等方面的挑战,但是随着硬件和技术的不断发展,RDMA技术有望成为未来网络互联的核心技术之一。