RMDA+UCX
RDMA
什么是RDMA
直接内存访问(DMA)是一种设备直接访问主机内存的技术,而不需要CPU的干预。
RDMA(远程DMA)是在不中断系统上CPU处理的情况下访问远程机器上的内存的技术。
RDMA的优势
使用RDMA有以下主要优点:
零复制——应用程序可以执行数据传输而不涉及网络软件堆栈,数据被发送和接收直接到缓冲区,而不需要在网络层之间复制。
内核旁路——应用程序可以直接从用户空间执行数据传输,而不需要执行上下文切换。
不涉及CPU——应用程序可以访问远程内存,而不消耗远程机器中的任何CPU。远程内存机器将在没有远程进程(或处理器)干预的情况下读取。远程CPU中的缓存不会被访问的内存内容填满。
基于消息的事务——数据作为离散的消息而不是流处理,这就消除了应用程序将流分隔成不同消息/事务的需要。
分散/收集条目支持——RDMA原生支持多个分散/收集条目,即读取多个内存缓冲区并将它们作为一个流发送,或获取一个流并将其写入多个内存缓冲区。
哪些网络协议支持RDMA?
InfiniBand (IB)——新一代网络协议,从一开始就支持RDMA。由于这是一种新的网络技术,它需要支持该技术的网卡和交换机。
RDMA融合以太网(RoCE) ——一种网络协议,允许在以太网上执行RDMA。它的下层网络头是以太网头,上层网络头(包括数据)是InfiniBand头。这允许在标准以太网基础设施(交换机)上使用RDMA。只有网卡应该是特殊的并支持RoCE。
Internet Wide Area RDMA Protocol (iWARP) ——一种允许在TCP上执行RDMA的网络协议。有些特性存在于IB和RoCE中,而iWARP不支持。这允许在标准以太网基础设施(交换机)上使用RDMA。只有网卡应该是特殊的,并支持iWARP(如果使用CPU卸载),否则,所有iWARP栈都可以在SW中实现,失去RDMA的大部分性能优势。
IPoIB (IP over InfiniBand)——是IETF IPoIB工作组指定的。IPoIB允许使用基于ip的应用程序,从而允许在InfiniBand结构中无缝地运行遗留应用程序和许多管理系统。
通过Mellanox OFED使用RDMA
对于一些操作系统,RDMA支持嵌入在内核中。例如,本地支持RDMA的Linux以及所有主要的Linux发行版都支持RDMA。其他操作系统可能需要下载一个包(比如OFED)来添加RDMA支持。
教程: https://www.rdmamojo.com/2014/11/22/working-rdma-using-mellanox-ofed/.
RDMA编程
相同的API(即verbs)可以用于上述所有启用RDMA的网络协议。在*nix中是libibverbs和kernel verbs,在Windows中是Network Direct (ND)。
编程手册: http://www.mellanox.com/related-docs/prod_software/RDMA_Aware_Programming_user_manual.pdf.
Linux内核驱动程序/infiniband子系统的用户空间组件: https://github.com/linux-rdma/rdma-core.
RDMA版本brpc: https://github.com/apache/incubator-brpc/tree/rdma.
直接在verbs上开发难度大,且稳定性不容易保证。下面介绍一个封装了RDMA的库,主要是它支持Multi-rail & Accelerated Verbs。
UCX
简介
统一通信X (UCX)提供了一组抽象的通信原语,它为消息传递接口(MPI)、分区全局地址空间(PGAS)/OpenSHMEM库和RPC/以数据为中心的应用程序提供了一个优化的通信层。UCX利用高速网络进行节点间通信,并利用共享内存机制进行有效的节点内通信。这些原语可以充分利用可用的硬件资源和卸载。包括RDMA (InfiniBand和RoCE)、TCP、gpu、共享内存和网络原子操作。UCX通过提供高级API促进快速开发,屏蔽低层细节,同时保持高性能和可伸缩性。
UCX框架由三个主要组件组成: UC-Services (UCS), UC-Transports (UCT), and UC-Protocols (UCP)。这些组件中的每一个都导出一个公共API,可以作为一个独立的库使用。
教程
看官网就完了
链接: https://www.openucx.org/.
重点
1.8版本有个重试的崩溃,不过是个小问题,要实际使用的话需要修改源码,新版本不知道有没有。
本博客是博主个人学习时的一些记录,不保证是为原创,如有侵权请与我联系。
留言即可,我会立即删除。