声明:本文转至IT168:因为GlusterFS实现了IB网络(RDMA协议,专用硬件网卡支持),当时就在想普通的网卡能不能实现,就找到一篇这样的文章介绍,基于TCP协议来实现。!
附件 RDMA over TCP 的协议栈工作过程浅析
第一节 RDMA 概述
随着网络带宽和速度的发展和大数据量数据的迁移的需求,网络带宽增长速度远远高于处理网络流量时所必需的计算节点的能力和对内存带宽的需求,数据中心网络架构已经逐步成为计算和存储技术的发展的瓶颈,迫切需要采用一种更高效的数据通讯架构。
传统的 TCP/IP 技术在数据包处理过程中,要经过操作系统及其他软件层,需要占用大量的服务器资源和内存总线带宽,所产生严重的延迟来自系统庞大的开销、数据在系统内存、处理器缓存和网络控制器缓存之间来回进行复制移动,如图 1.1 所示,给服务器的 CPU 和内存造成了沉重负担。特别是面对网络带宽、处理器速度与内存带宽三者的严重 " 不匹配性 " ,更造成了网络延迟效应的加剧。处理器速度比内存速度快得越多,等待相应数据的延迟就越多。而且,处理每一数据包时,数据必须在系统内存、处理器缓存和网络控制器缓存之间来回移动,因此延迟并不是一次性的,而是会对系统性能持续产生负面影响。
图 1.1 主机接收传统以太网数据的典型数据流示意图
这样,以太网的低投入、低运营成本优势就难以体现。为充分发挥万兆位以太网的性能优势,必须解决应用性能问题。系统不能以软件方式持续处理以太网通信;主机 CPU 资源必须释放专注于应用处理。业界最初的解决方案是采用 TCP/IP 负荷减轻引擎( TOE )。 TOE 方案能提供系统性能,但协议处理不强;它能使 TCP 通信更快速,但还达不到高性能网络应用的要求。解决这类问题的关键,是要消除主机 CPU 中不必要的频繁数据传输,减少系统间的信息延迟。
RDMA ( Remote Direct Memory Access )全名是 " 远程直接数据存取 " , RDMA 让计算机可以直接存取其它计算机的内存,而不需要经过处理器耗时的传输,如图 1.2 所示。 RDMA 是一种使一台计算机可以直接将数据通过网络传送到另一台计算机内存中的特性,将数据从一个系统快速移动到远程系统存储器中,而不对操作系统造成任何影响,这项技术通过消除外部存储器复制和文本交换操作,因而能腾出总线空间和 CPU 周期用于改进应用系统性能,从而减少对带宽和处理器开销的需要,显著降低了时延。
图 1.2 RDMA 数据流传输示意图
RDMA 对以太网来说还是 " 新生事物 " ,但以不同形式存在已有十多年时间,它是 Infiniband 技术的基础。产业标准 API (应用程序接口)使 RDMA 从技术走向实现成为可能。其中包括用于低时延消息处理、成就高性能计算的 MPI (消息通过接口),以及 DAPL (直接接入供应库)。后者包括两部分: KDAPL 和 UDAPL ,分别用于内核和用户(应用程序)。 Linux 支持 KDAPL ,其它操作系统将来也有可能支持。 RDMA 在高性能计算环境广为采纳,在商务应用领域很少,但如今大多应用程序都能直接支持操作系统,透过操作系统(如 NFS )间接利用 RDMA 技术的优势是完全可能的。
第二节 RDMA 工作原理
RDMA 是一种网卡技术,采用该技术可以使一台计算机直接将信息放入另一台计算机的内存中。通过最小化处理过程的开销和带宽的需求降低时延。 RDMA 通过在网卡上将可靠传输协议固化于硬件,以及支持零复制网络技术和内核内存旁路技术这两种途径来达到这一目标。 RDMA 模型如图 2.1 所示。
图 2.1 RDMA 模型演变
零复制网络技术使 NIC 可以直接与应用内存相互传输数据,从而消除了在应用内存与内核内存之间复制数据的需要。
内核内存旁路技术使应用程序无需执行内核内存调用就可向网卡发送命令。在不需要任何内核内存参与的条件下, RDMA 请求从用户空间发送到本地 NIC 并通过网络发送给远程 NIC ,这就减少了在处理网络传输流时内核内存空间与用户空间之间环境切换的次数。
当一个应用程序执行 RDMA 读 / 写请求时,系统并不执行数据复制动作,这就减少了处理网络通信时在内核空间和用户空间上下文切换的次数。在不需要任何内核内存参与的条件下, RDMA 请求从运行在用户空间中的应用中发送到本地 NIC (网卡),然后经过网络传送到远程 NIC 。请求完成既可以完全在用户空间中处理 ( 通过轮询用户级完成排列 ) ,或者在应用一直睡眠到请求完成时的情况下通过内核内存处理。
RDMA 操作使应用可以从一个远程应用的内存中读数据或向这个内存写数据。 RDMA 操作用于读写操作的远程虚拟内存地址包含在 RDMA 消息中传送,远程应用程序要做的只是在其本地网卡中注册相应的内存缓冲区。远程节点的 CPU 在整个 RDMA 操作中并不提供服务,因此没有带来任何负载。通过类型值(键值)的使用,一个应用程序能够在远程应用程序对它进行随机访问的情况下保护它的内存。
发布 RDMA 操作的应用程序必须为它试图访问的远程内存指定正确的类型值,远程应用程序在本地网卡中注册内存时获得这个类型值。发布 RDMA 的应用程序也必须确定远程内存地址和该内存区域的类型值。远程应用程序会将相关信息通知给发布 RDMA 的应用程序,这些信息包括起始虚拟地址、内存大小和该内存区域的类型值。在发布 RDMA 的应用程序能够对该内存区域进行 RDMA 操作之前,远程应用程序应将这些信息通过发送操作传送给发布 RDMA 的应用程序。
第三节 RDMA 操作类型
具备 RNIC ( RDMA-aware network interface controller )网卡的设备,不论是目标设备还是源设备的主机处理器都不会涉及到数据传输操作, RNIC 网卡负责产生 RDMA 数据包和接收输入的 RDMA 数据包,从而消除传统操作中多余的内存复制操作。
RDMA 协议提供以下 4 种数据传输操作,除了 RDMA 读操作不会产生 RDMA 消息,其他操作都会产生一条 RDMA 消息。
RDMA Send 操作;
Send operation ;
Send with invalidate operation ;
Send with solicited event ;
Send with solicited event and invalidate ;
RDMA Write 操作;
RDMA Read 操作;
Terminate 操作。
第四节 RDMA over TCP
以太网凭借其低投入、后向兼容、易升级、低运营成本优势在目前网络互连领域内占据统治地位,目前主流以太网速率是 100 Mb/s 和 1000 Mb/s ,下一代以太网速率将会升级到 10 Gb/s 。将 RDMA 特性增加到以太网中,将会降低主机处理器利用率,增加以太网升级到 10 Gb/s 的优点,消除由于升级到 10 Gb/s 而引入巨大开销的弊端,允许数据中心在不影响整体性能的前提下拓展机构,为未来扩展需求提供足够的灵活性。
RDMA over TCP 协议将数据直接在两个系统的应用内存之间进行交互,对操作系统内核几乎没有影响,并且不需要临时复制到系统内存的操作,数据流如图 4.1 所示。
图 4.1 RDMA over TCP (Ethernet) 数据流示意图
RDMA over TCP 协议能够工作在标准的基于 TCP/IP 协议的网络,如目前在各个数据中心广泛使用的以太网。注意: RDMA over TCP 并没有指定物理层信息,能够工作在任何使用 TCP/IP 协议的网络上层。 RDMA over TCP 允许很多传输类型来共享相同的物理连接,如网络、 I/O 、文件系统、块存储和处理器之间的消息通讯。
图 4.2 RDMA over TCP (Ethernet) 协议栈
图 4.2 是 RDMA over TCP (Ethernet) 的协议栈,最上面三层构成 iWARP 协议族,用来保证高速网络的互操作性。
RDMA 层协议负责根据 RDMA 写操作、 RDMA 读操作转换成 RDMA 消息,并将 RDMA 消息传向 Direct Data Placement (DDP) 层。 DDP 层协议负责将过长的 RDMA 消息分段封装成 DDP 数据包继续向下转发到 Marker-based, Protocol-data-unit-Aligned (MPA) 层。 MPA 层在 DDP 数据段的固定间隔位置增加一个后向标志、长度以及 CRC 校验数据,构成 MPA 数据段。 TCP 层负责对 TCP 数据段进行调度,确保发包能够顺利到达目标位置。 IP 层则在数据包中增加必要的网络路由数据信息。
DDP 层的 PDU 段的长度是固定的, DDP 层含有一个成帧机制来分段和组合数据包,将过长的 RDMA 消息分段封装为 DDP 消息,处理过程如图 4.3 所示。
图 4.3 DDP 层拆分 RDMA 消息示意图
DDP 数据段是 DDP 协议数据传输的最小数据单元,包含 DDP 协议头和 ULP 载荷。 DDP 协议头包含 ULP 数据的最终目的地址的位置和相关控制信息。 DDP 层将 ULP 数据分段的原因之一就是 TCP 载荷的最大长度限制。 DDP 的数据传输模式分为 2 种: tagged buffer 方式和 untagged buffer 方式。 tagged buffer 方式一般应用于大数据量传输,例如磁盘 I/O 、大数据结构等;而 untagged buffer 方式一般应用于小的控制信息传输,例如:控制消息、 I/O 状态信息等。
MPA 层在 DDP 层传递下来的 DDP 消息中, MPA 层通过增加 MPA 协议头、标志数据以及 CRC 校验数据构成 FPDU(framed PDU ) 数据段,处理过程如图 4.4 所示。
MPA 层便于对端网络适配器设备能够快速定位 DDP 协议头数据,根据 DDP 协议头内设置的控制信息将数据直接置入相应的应用内存区域。 MPA 层具备错序校正能力,通过使能 DDP , MPA 避免内存复制的开销,减少处理乱序数据包和丢失数据包时对内存的需求。 MPA 将 FPDU 数据段传送给 TCP 层处理。
图 4.4 MPA 层拆分 DDP 消息示意图
TCP 层将 FPDU 数据段拆放置在 TCP 数据段中,确保每个 TCP 数据段中都包含 1 个单独的 FDPU 。 MPA 接收端重新组装为完整的 FPDU ,验证数据完整性,将无用的信息段去除,然后将完整的 DDP 消息发送到 DDP 层进行处理。 DDP 允许 DDP 数据段中的 ULP 协议( Upper Layer Protocol )数据,例如应用消息或磁盘 I/O 数据,不需要经过 ULP 的处理而直接放置在目的地址的内存中,即使 DDP 数据段乱序也不影响这种操作。
第五节 RDMA 标准组织
2001 年 10 月, Adaptec 、 Broadcom 、 Cisco 、 Dell 、 EMC 、 HP 、 IBM 、 Intel 、 Microsoft 和 NetApp 公司宣布成立 " 远程直接内存访问( RDMA )联盟 " 。 RDMA 联盟是个独立的开放组织,其制定实施能提供 TCP/IP RDMA 技术的产品所需的体系结构规范,鼓励其它技术公司积极参与新规范的制定。该联盟将负责为整个 RDMA 解决方案制定规范,包括 RDMA 、 DDP (直接数据放置)和 TCP/IP 分帧协议。
RDMA 联盟是 Internet 工程任务组( IETF )的补充, IETF 是由网络设计师、运营商、厂商和研究公司组成的大型国际组织。其目的是推动 Internet 体系结构的发展,并使 Internet 的运作更加顺畅。 RDMA 联盟的成员公司和个人都是 IETF 的积极参与者。另外, IETF 还认识到了 RDMA 在可行网络方案中的重要性,并计划在以后几个月里成立 "Internet 协议套件 RDMA" 工作组。 RDMA 联盟协议规定,联盟将向相应的 IETF 工作组提交规范草案,供 IETF 考虑。
TCP/IP RDMA 体系结构规范的 1.0 版本于 2002 年 10 月由 RDMA 联盟成员发布, TCP/IP RDMA 的最终规范将由 RDMA 联盟的业界合作伙伴及相应的业界标准组织派出的代表共同确定。 RDMA 联盟官方网址: http://www.rdmaconsortium.org 。