王恒宇,中科院软件所基础软件实验室研究生。主要研究方向为软硬件融合,对物联网、操作系统、Serverless等方向感兴趣。DatenLord社区async-rdma项目贡献者之一,曾获嵌入式芯片与系统设计竞赛一等奖等多项国家级奖项,参与编写《openEuler操作系统》一书。
async-rdma是由DatenLord社区发起的Rust异步RDMA编程库,致力于提升高性能网络应用的开发效率。在介绍async-rdma之前我们先来了解一下RDMA的概念及其使用方式。
RDMA简介
RDMA(Remote Direct Memory Access)直译为远程直接内存访问,是一种将一台主机内存中的内容直接传输到另一台主机内存中的技术。计算机中常用的DMA技术避免了CPU忙于将数据从I/O设备拷贝到内存,RDMA则将这一能力拓展到了通过网络连接的多台主机之间。
RDMA在初始化阶段完成后可以由用户态程序通过用户态驱动直接操作RDMA网卡收发数据,无需陷入内核,避免了上下文切换,也无需CPU进行内存拷贝。凭借绕过内核(kernel bypass)和零拷贝(zero copy)等特性,RDMA能以极低的CPU占用率实现高吞吐、低时延网络通信。这里简要介绍下文中用到的RDMA的核心概念,若想进一步了解RDMA的细节可以关注知乎的系列博客,或更进一步翻阅RDMA协议规范了解细节。
- MR(Memory Region):RDMA应用程序向操作系统申请和注册的一片内存,用于后续RDMA操作。MR不光有地址和长度,还包含其他RDMA特有的元数据,如权限位,除本地读写权限还有远端读写权限等。
- 两种操作类型:
1. 单端操作(SEND & RECV)- 发送、接收数据,一端Send前需要对端先Receive
- 对端CPU需要感知每次收发操作
- 用于交换元数据等小数据量操作
2. 双端操作(READ & WRITE)
-
- 直接对目标主机内存进行读写,请求发送前后对端无需进行操作
- 对端CPU不感知单端操作,读写完成后网卡自动响应
- RDMA的主要优势所在,适用于大数据量传输
现有RDMA开发方法
我们使用Socket API编写基于TCP/IP的网络应用,基于RDMA的网络应用开发则使用由C语言编写的Verbs API。Verbs API提供了统一的编程接口,屏蔽了RDMA底层协议复杂多样的实现,保障了应用程序的通用性。以下是两个Verbs API实例,暂且不关注其各个参数的具体含义,只观察其类型就可以发现其中隐含的内存安全问题。我们无法确定裸指针所指数据是否有效,在开发过程中很容易