参考:
RDMA (Remote Direct Memory Access, 远程直接内存访问)
背景
计算机网络通信中最重要的两个衡量指标: 高带宽, 低延迟
- 通信延迟: 处理延迟 + 网络传输延迟
- 处理延迟: 消息在发送和接收阶段的处理时间
- buffer 管理
- 在不同内存空间中消息复制
- 消息发送完成后的系统中断
- …
- 网络传输延迟: 消息在发送和接收方的网络传输时延
- 处理延迟: 消息在发送和接收阶段的处理时间
当今计算机网络的消息通信:
- Large Messages: 网络传输延迟占整个通信中的主导位置
- Small Messages: 处理开销占整个通信的主导地位
- 在现实计算机通信占主导地位
传统 TCP/IP 通信模式
通信过程
传统的 TCP/IP 网络通信,数据需要通过用户空间发送到远程机器的用户空间
- 数据发送方
- 数据复制:将数据从用户应用空间 Buffer 复制到内核空间的 Socket Buffer 中
- 数据包封装处理:内核空间中添加数据包头,进行数据封装,通过一系列多层网络协议的数据包处理工作,这些协议包括:
- TCP: 传输控制协议
- UDP: 用户数据报协议
- IP: 互联网协议
- ICMP: 互联网控制消息协议
- 将数据 Push 到 NIC 网卡中的 Buffer 进行网络传输
- 消息接受方
- 接受从远程机器发送的数据包
- 将数据包从 NIC Buffer 中复制数据到 Socket Buffer
- 数据包解析:多层网络协议的数据包解析
- 将解析后的数据复制到相应位置的用户空间 Buffer
- 系统上下文切换,用户应用程序获得数据
存在的主要问题: I/O bottleneck 瓶颈问题
采用 Messaging passing through kernel 方式会导致很低的性能和很低的灵活性
- 性能低: 由于网络通信通过内核传递,存在很高的数据移动和数据复制的开销
- 灵活性低:主要是所有网络通信协议通过内核传递,很难去支持新的网络协议和新的消息通信协议以及发送和接收接口
高性能网络通信
- TCP Offloading Engine (TOE)
- User-Net Networking (U-Net)
- 第一个跨过内核网络通信的模式之一
- Virtual interface Architecture (VIA)
- 首次提出了标准化 user-level 的网络通信模式
- 组合了 U-Net 接口和远程 DMA 设备
- Remote Direct Memroy Access (RDMA)
TCP Offloading Engine (TOE)
在主机通过网络进行通信的过程中,主机处理器需要耗费大量资源进行多层网络协议的数据包处理工作,这些协议包括传输控制协议(TCP)、用户数据报协议(UDP)、互联网协议(IP)以及互联网控制消息协议(ICMP)等。由于CPU需要进行繁重的封装网络数据包协议,为了将占用的这部分主机处理器资源解放出来专注于其他应用,人们发明了TOE(TCP/IP Offloading Engine)技术,将上述主机处理器的工作转移到网卡上。
这种技术需要特定网络接口-网卡支持这种Offloading操作。这种特定网卡能够支持封装多层网络协议的数据包,这个功能常见于高速以太网接口上,如吉比特以太网(GbE)或10吉比特以太网(10GbE)。
User-Net Networking (U-Net)
U-Net 的设计目标是将协议处理部分移动到用户空间去处理。这种方式避免了用户空间将数据移动和复制到内核空间的开销。它的设计宗旨就是移动整个协议栈到用户空间中去,并且从数据通信路径中彻底删除内核。这种设计带来了高性能的提升和高灵活性的提升。
U-Net 的 virtual NI 为每个进程提供了一种拥有网络接口的错觉,内核接口只涉及到连接步骤。传统上的网络,内核控制整个网络通信,所有的通信都需要通过内核来传递。U-Net应用程序可以通过MUX直接访问网络,应用程序通过MUX直接访问内核,而不需要将数据移动和复制到内核空间中去。
RDMA 简介
- Remote:数据通过网络与远程机器间进行数据传输。
- Direct:没有内核的参与,有关发送传输的所有内容都卸载到网卡上。
- Memory:在用户空间虚拟内存与RNIC网卡直接进行数据传输不涉及到系统内核,没有额外的数据移动和复制。
- Access:send、receive、read、write、atomic操作。
主要解决的问题: 网络传输中客户端与服务器端数据处理的延迟
- 将数据直接从一台计算机的内存传输到另一台计算机,无需双方操作系统的介入
- 这允许高吞吐、低延迟的网络通信
- 尤其适合在大规模并行计算机集群中使用
- 通过网络把数据直接传入计算机的内存中,将数据从一个系统快速移动到远程系统内存中,而不对操作系统造成任何影响,这样就不需要用到多少计算机的处理能力
- 消除了数据包在用户空间和内核空间复制移动和上下文切换的开销
- 因而能解放内存带宽和 CPU 周期用于改进应用系统性能