学习笔记-RDMA技术上篇

RDMA(Remote Direct Memory Access)是一种旨在减少网络通信延迟、提高带宽的技术,它允许数据直接在不同计算机的内存间传输,无需操作系统干预。本文介绍了RDMA的低延迟、低CPU开销和高带宽特性,以及Memory verbs和Messaging verbs两种基本操作。同时,讨论了InfiniBand、iWARP和RoCE三种不同的RDMA硬件实现,其中RoCE是在以太网上实现RDMA的协议,有RoCEv1和RoCEv2两个版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在看博通的智能网卡时候,看到了RoCE(RDMA over Converged Ethernet)技术,对于这种陌生的名词,第一反应当然是百度了,然后记到优快云这个小本本上。

要了解RoCE,首先就要了解RDMA。

一、什么是RDMA

       RDMA(RemoteDirect Memory Access)技术全称远程直接内存访问,就是为了解决网络传输中客户端与服务器端数据处理的延迟而产生的。它将数据直接从一台计算机的内存传输到另一台计算机,无需双方操作系统的介入。这允许高吞吐、低延迟的网络通信,尤其适合在大规模并行计算机集群中使用。RDMA通过网络把资料直接传入计算机的内存中,将数据从一个系统快速移动到远程系统内存中,而不对操作系统造成任何影响,这样就不需要用到多少计算机的处理能力。它消除了数据包在用户空间和内核空间复制移动和上下文切换的开销,因而能解放内存带宽和CPU周期用于改进应用系统性能。

二、背景

    我们都知道OSI七层模型,传统的TCP/IP网络通信,数据需要通过用户空间发送到远程机器的用户空间。数据发送方需要讲数据从用户应用空间Buffer复制到内核空间的Socket Buffer中。然后内核空间中添加数据包头,进行数据封装。通过一系列多层网络协议的数据包处理工作,这些协议包括传输控制协议(TCP)、用户数据报协议(UDP)、互联网协议(IP)以及互联网控制消息协议(ICMP)等。数据才被Push到NIC网卡中的Buffer进行网络传输。消息接受方接受从远程机器发送的数据包后,要将数据包从NIC Buffer中复制数据到Socket Buffer。然后经过一些列的多层网络协议进行数据包的解析工作。解析后的数据被复制到相应位置的用户空间Buffer。这个时候再进行系统上下文切换,用户应用程序才被调用。以上就是传统的TCP/IP协议层的工作。

   计算机网络通信中,最重要的两个指标是高带宽和低延迟,我们没有办法在带宽中做手脚,那么只有在低延迟这部分下功夫了。这里的延迟主要有处理延迟和网络延迟,网络延迟和硬件条件有直接关系。所以我们只能尽量降

### 关于 Rust 中 Async RDMA 的实现 #### 使用 `async-ucx` 库构建异步 RDMA 程序 在 Rust 生态系统中,`async-ucx` 是一个用于与 UCX (Unified Communication X) 进行交互的库。UCX 提供了高性能通信原语的支持,其中包括RDMA功能。下面是一个简单例子展示如何利用 `tokio` 和 `async-ucx` 来创建一个基本的服务端和客户端应用[^1]。 对于服务端而言: ```rust use async_ucx::UcxEndpoint; use tokio; #[tokio::main] async fn main() { let listener = UcxEndpoint::bind("0.0.0.0:8080").await.unwrap(); while let Ok((mut stream, _)) = listener.accept().await { tokio::spawn(async move { if let Ok(message) = stream.read_to_string().await { println!("Received message from client: {}", message); // Echo back the received message to the client. stream.write_all(message.as_bytes()).await.unwrap(); } }); } } ``` 而对于客户端来说,则可以这样编写代码来连接到上述服务器并发送消息: ```rust use async_ucx::{UcxSocket,UcxEndpoint}; use tokio; #[tokio::main] async fn main() -> std::io::Result<()>{ let mut socket = UcxSocket::connect("127.0.0.1:8080").await?; const MESSAGE:&str="Hello Server!"; socket.write_all(MESSAGE.as_bytes()).await?; let mut buffer=String::new(); socket.read_to_string(&mut buffer).await?; println!("Server echoed back with :{}",buffer); Ok(()) } ``` 这段代码展示了怎样通过 `async-ucx` 实现了一个简单的回声(Echo)协议,在这个过程中涉及到了RDMA的操作。需要注意的是实际部署时还需要配置好网络环境以确保两端能够正常通讯,并且可能需要调整防火墙设置允许相应端口的数据传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值