RDMA(RemoteDirect Memory Access,远程直接内存访问) 是一种为了解决网络传输中服务器端数据处理的延迟而产生的技术。它将数据直接从一台计算机的内存传输到另一台计算机,无需双方操作系统的介入。
介绍
- RDMA 的优势
- 零拷贝(Zero-copy)
- 内核旁路(Kernel bypass)
- 不需要 CPU 干预(No CPU involvement)
- 消息基于事务(Message based transactions)
- 支持分散/聚合条目(Scatter/gather entries support)
RDMA、InfiniBand、IB卡、IB驱动关系
- 区别与传统的数据传输,由一台机器的用户空间发送到另一台远程机器的用户空间
IB(InfiniBand, 无限带宽)网络的物理链路协议 是一个用于高性能计算(HPC)的计算机网络通信标准(协议),它具有极高的吞吐量和极低的延迟,用于计算机与计算机之间的数据互连。类似的协议还有 iWARP、RoCE
InfiniBand Verbs API,是远程直接访问(RDMA)技术的实现
- IB 卡,是实现 InfiniBand 协议的硬件
- IB 驱动,IB 卡依赖 IB 驱动才能实现 InfiniBand 协议的 RDMA 技术
区别
- 图片参考
- 1999 年,由 Compaq、Dell、HP、IBM、Intel、Microsoft 和 Sun 公司组成了 IBTA 组织
- 愿景是设计一种更高速的新的互联协议规范标准,来应对传统以太网在面对未来计算机行业的发展时可能遇到的瓶颈
- 2000 年,IBTA 组织设计并发布了 Infiniband Architecture Specification 1.0(IB 规范)
- 2007 年,IETF 发布了 iWARP(Internet Wide Area RDMA Protocol)的一系列 RFC
- 2010 年,IBTA 发布了 RoCE v1 规范
- 2014 年,IBTA 发布了 RoCE v2 规范
- RDMA 技术(或标准)支持三类协议,分别为:
InfiniBand(IB) 更多参考Mellanox 网卡
- 由于 IB 是新的网络技术,因此需要支持该技术的网卡和交换机
RDMA over Converged Ethernet(RoCE) RDMA 过融合以太网,即 RDMA over Ethernet,允许通过以太网实现 RDMA 的网络协议,更多参考RoCE 协议介绍
- 阿里云是国内率先部署 RoCE RDMA 的云厂商
internet Wide Area RDMA Protocol(iWARP) 互联网广域 RDMA 协议,RDMA over TCP,允许通过 TCP 实现 RDMA 的网络协议
- 在标准以太网基础架构(交换机)上使用 RDMA,只不过网卡要求是支持 iWARP(如果使用 CPU offload 的话)的 NIC。否则,所有 iWARP 栈都可以在软件中实现,但是失去了大部分的 RDMA 性能优势。
iWARP、RoCE 是非 InfiniBand 硬件上实现 RDMA 技术
相关术语
Fabric 支持 RDMA 的局域网(LAN)
A local-area RDMA network is usually referred to as a fabric.
CA(Channel Adapter, 通道适配器)
A channel adapter is the hardware component that connects a system to the fabric.
- CA 是将系统连接到 Fabric 的硬件组件
- 在 IBTA 中,一个 CA 就是 IB 子网中的一个终端结点(End Node)。分为两种类型,
- 一种是
HCA(Host Channel Adapter) 是支持 verbs 接口的 CA
- 另一种叫做
TCA(Target Channel Adapter) 可以理解为 weak CA,不需要像 HCA 一样支持很多功能。
HCA 和 TCA 合称为 xCA
- 在 IEEE/IETF 中,CA 的概念被实体化为
RNIC(RDMA Network Interface Card),iWARP 就把一个 CA 称之为一个 RNIC
Verbs Verbs 这个词不好翻译,大致可以理解为访问 RDMA 硬件的 一组标准动作
- 每一个 Verb 可以理解为一个 Function
Memory Registration(MR) 内存注册
- RDMA 一共支持三种队列:
- 发送队列(SQ)
- 接收队列(RQ)
- 完成队列(CQ)
使用
Docker 中使用 RDMA 设备
sudo docker run --net=host --device=/dev/infiniband/uverbs0 --device=/dev/infiniband/rdma_cm --ulimit memlock=-1 -t -i <IMAGE ID> /bin/bash
说明:
--net=host:配置容器的通信模式为 host
- 容器内的应用程序可以直接使用主机的网络接口和网络配置,从而实现与主机相同的网络通信能力
--device=/dev/infiniband/uverbs0和--device=/dev/infiniband/rdma_cm:将 RDMA 对应的用户态字符设备暴露到容器中
--ulimit memlock=-1:将 maxlockedmemory 设置为 unlimited 表示不限制非 root 用户锁定内存的数量
- 这可以确保 eRDMA 应用程序在非 root 用户下能够锁定所需的内存量,从而有效地使用 eRDMA 功能
- docker 中需要安装 rdma 相关的包:
apt install libibverbs rdma-core librdmacm libibverbs-utils
- 参考