Glusterfs之rpc模块源码分析(下)之RDMA over TCP的协议栈工作过程浅析

2024-03-15 05:38

本文主要是介绍Glusterfs之rpc模块源码分析(下)之RDMA over TCP的协议栈工作过程浅析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.csdn.net/wanweiaiaqiang/article/details/7566779



第一节 RDMA概述

随着网络带宽和速度的发展和大数据量数据的迁移的需求,网络带宽增长速度远远高于处理网络流量时所必需的计算节点的能力和对内存带宽的需求,数据中心网络架构已经逐步成为计算和存储技术的发展的瓶颈,迫切需要采用一种更高效的数据通讯架构。

  传统的TCP/IP技术在数据包处理过程中,要经过操作系统及其他软件层,需要占用大量的服务器资源和内存总线带宽,所产生严重的延迟来自系统庞大的开销、数据在系统内存、处理器缓存和网络控制器缓存之间来回进行复制移动,如图1.1所示,给服务器的CPU和内存造成了沉重负担。特别是面对网络带宽、处理器速度与内存带宽三者的严重"不匹配性",更造成了网络延迟效应的加剧。处理器速度比内存速度快得越多,等待相应数据的延迟就越多。而且,处理每一数据包时,数据必须在系统内存、处理器缓存和网络控制器缓存之间来回移动,因此延迟并不是一次性的,而是会对系统性能持续产生负面影响。


  图1.1 主机接收传统以太网数据的典型数据流示意图

  这样,以太网的低投入、低运营成本优势就难以体现。为充分发挥万兆位以太网的性能优势,必须解决应用性能问题。系统不能以软件方式持续处理以太网通信;主机CPU资源必须释放专注于应用处理。业界最初的解决方案是采用TCP/IP负荷减轻引擎(TOE)。TOE方案能提供系统性能,但协议处理不强;它能使TCP通信更快速,但还达不到高性能网络应用的要求。解决这类问题的关键,是要消除主机CPU中不必要的频繁数据传输,减少系统间的信息延迟。

  RDMARemote Direct Memory Access)全名是"远程直接数据存取"RDMA让计算机可以直接存取其它计算机的内存,而不需要经过处理器耗时的传输,如图1.2所示。RDMA是一种使一台计算机可以直接将数据通过网络传送到另一台计算机内存中的特性,将数据从一个系统快速移动到远程系统存储器中,而不对操作系统造成任何影响,这项技术通过消除外部存储器复制和文本交换操作,因而能腾出总线空间和CPU周期用于改进应用系统性能,从而减少对带宽和处理器开销的需要,显著降低了时延。


  图1.2 RDMA数据流传输示意图

  RDMA对以太网来说还是"新生事物",但以不同形式存在已有十多年时间,它是Infiniband技术的基础。产业标准API(应用程序接口)使RDMA从技术走向实现成为可能。其中包括用于低时延消息处理、成就高性能计算的MPI(消息通过接口),以及DAPL(直接接入供应库)。后者包括两部分:KDAPLUDAPL,分别用于内核和用户(应用程序)。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 操作类型

  具备RNICRDMA-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/s1000 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.2RDMA 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层具备错序校正能力,通过使能DDPMPA避免内存复制的开销,减少处理乱序数据包和丢失数据包时对内存的需求。MPAFPDU数据段传送给TCP层处理。


  图4.4 MPA层拆分DDP消息示意图

  TCP层将FPDU数据段拆放置在TCP数据段中,确保每个TCP数据段中都包含1个单独的FDPUMPA接收端重新组装为完整的FPDU,验证数据完整性,将无用的信息段去除,然后将完整的DDP消息发送到DDP层进行处理。DDP 允许DDP数据段中的ULP协议(Upper Layer Protocol)数据,例如应用消息或磁盘I/O数据,不需要经过ULP的处理而直接放置在目的地址的内存中,即使DDP数据段乱序也不影响这种操作。

第五节RDMA标准组织

  200110月,AdaptecBroadcomCiscoDellEMCHPIBMIntelMicrosoftNetApp公司宣布成立"远程直接内存访问(RDMA)联盟"RDMA联盟是个独立的开放组织,其制定实施能提供TCP/IP RDMA技术的产品所需的体系结构规范,鼓励其它技术公司积极参与新规范的制定。该联盟将负责为整个RDMA解决方案制定规范,包括RDMADDP(直接数据放置)和TCP/IP分帧协议。

  RDMA联盟是Internet工程任务组(IETF)的补充,IETF是由网络设计师、运营商、厂商和研究公司组成的大型国际组织。其目的是推动Internet体系结构的发展,并使Internet的运作更加顺畅。RDMA联盟的成员公司和个人都是IETF的积极参与者。另外,IETF还认识到了RDMA在可行网络方案中的重要性,并计划在以后几个月里成立"Internet协议套件RDMA"工作组。RDMA联盟协议规定,联盟将向相应的IETF工作组提交规范草案,供IETF考虑。

  TCP/IP RDMA体系结构规范的1.0版本于200210月由RDMA联盟成员发布, TCP/IP RDMA的最终规范将由RDMA联盟的业界合作伙伴及相应的业界标准组织派出的代表共同确定。RDMA联盟官方网址:http://www.rdmaconsortium.org



这篇关于Glusterfs之rpc模块源码分析(下)之RDMA over TCP的协议栈工作过程浅析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/810972

相关文章

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle