热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【RDMA】InfiniBand如何工作和小消息通信性能优化方案

目录前言快速PCIe背景涉及的基本机制操作特性前言bandaoyu本文随时更新,地址:https:blog.csdn.netbandaoyuarticled

目录

前言

快速PCIe背景

涉及的基本机制

操作特性



前言

bandaoyu 本文随时更新,地址:https://blog.csdn.net/bandaoyu/article/details/119204643 

原文:How does InfiniBand work?-https://www.rohitzambre.com/blog/2019/4/27/how-are-messages-transmitted-on-infiniband

How does InfiniBand work? -https://www.rohitzambre.com/blog/2019/4/27/how-are-messages-transmitted-on-infiniband

其他翻译:InfiniBand如何工作? - https://zhuanlan.zhihu.com/p/336504815

摘要:这篇文章描述了在 InfiniBand 互连环境中 传输消息并发出‘’信号完成’,CPU 和 NIC 之间通过 PCI Express 结构在幕后发生的一系列协同事件。

通过InfiniBand发送消息的主要方法是通过Verbs API。libibverbs是这个API的标准实现,由linux RDMA社区维护。Verbs有两种功能:慢路径功能和快路径功能。慢路径功能(如ibv_open_device、ibv_alloc_pd等)是与资源(如上下文、保护域和内存区域)的创建和配置相关的功能。它们之所以被称为“慢”,是因为它们涉及内核,因此会产生上下文切换的昂贵开销。快速路径功能(如ibv_post_send、ibv_poll_cq等)处理操作的启动和完成。它们被称为“快”,因为它们绕过内核,因此比慢路径功能快得多。通信的关键路径主要由快速路径功能和偶尔的慢路径功能组成,如ibv_reg_mr,以动态注册内存区域(取决于通信中间件)。本文主要讨论程序员执行ibv_post_send后发生的机制。


快速PCIe背景

网络接口卡(NIC)通常通过PCI Express(PCIe)插槽连接到服务器。PCIe I/O子系统的主要导体(conductor )是根复合体(Roo Complex, RC)。RC将处理器和内存连接到PCIe结构。

CPU和Memory和PCIe结构通过RC(Roo Complex, RC)将连接在一起。

PCIe结构可以包括一个设备的层次结构。  连接到PCIe结构的外围设备称为PCIe端点(PCIe endpoints)。

824bc69ab1d863dc392eda89bf76c6e4.png

PCIe总结--3层协议层补充_-https://blog.csdn.net/Fuji_Shikamaru/article/details/105329381

PCIe协议由三层组成:事务层、数据链路层和物理层。

第一层,最上层,描述发生的事务的类型。

对于本文,两种类型的传输层数据包(TLP)是相关的:Memory Write(MWr)和Memory Read(MRd)。与独立的MWr TLP不同,MRd TLP与来自目标PCIe端点的“带数据完成”( Completion with Data, CplD)事务耦合在一起,该事务包含启动器请求的数据。

数据链路层使用数据链路层分组(DLLP)确认(ACK/NACK)和基于Credits的流控制机制来确保所有事务的成功执行。发起方可以发出一个事务,只要它有足够的Credits额度。当它从它的邻居那里接收到更新流控制(UpdateFC)DLLPs时,它的Credits就会被补充。这种流控制机制允许PCIe协议具有多个未完成事务。

461dac1ae063e9129c27a0fcb2f0c837.png

 PCIe总结--3层协议层补充_https://blog.csdn.net/Fuji_Shikamaru/article/details/105329381


涉及的基本机制

首先,将描述如何使用完全卸载(即绕过内核)的方法发送消息,也就是说,CPU只通知网卡(NIC)有消息要传输;NIC将做剩下的所有其他事情来传输数据,如此一来,CPU就可以更多做其他事情。然而,这种方法可能不利于小消息的通信性能(这一点很快就会显现出来)。为了提高这种情况下的通信性能,InfiniBand提供了一些操作特性,将在下一节中介绍这些特性。


从CPU程序员的角度来看,存在一个传输队列(Verbs中是:队列对(Queue Pair,QP))和完成队列(Verbs中是:CQ)。用户将他们的消息描述符(MD;Work Queue Element/Entry(WQE;wookie)以Verbs形式post到传输队列,然后在CQ上轮询以确认所发布消息的完成。用户也可以要求得到有关完成情况的中断通知,但是,轮询方法是面向延迟的(更适合于要求低延迟的通信),因为关键路径中没有上下文切换到内核。消息在网络上的实际传输通过处理器芯片和网卡之间的协调来实现,使用内存映射I/O(MMIO)和直接内存访问(DMA)读写。下图中描述这些步骤。

(图中标明了步骤序号)

步骤0:用户首先将MD (wr ?)排队到TxQ (SQ ?)中。然后,CPU(网络驱动程序)准备特定于设备的 MD,其中包含 NIC 的标头和指向有效负载的指针。

步骤1:使用8字节的原子写入内存映射位置,CPU(网络驱动程序)按门铃(1)通知NIC消息已准备好要发送。RC使用MWr(MemoryWrite)PCIe事务 执行响门铃。

 步骤2:门铃响后,网卡通过DMA读取MD。MRd PCIe事务执行DMA读取。

步骤3:(从MD知道待传输的数据在哪里)NIC将使用另一个DMA读取(另一个MRd TLP)从注册的内存区域获取有效负载。请注意,在NIC可以执行DMA读取之前,必须将虚拟地址转换为物理地址。

(2-3:先MRd PCIe  dma读取MD获取负载信息,再MRd TLP  dma读取有效负载)

步骤4:一旦网卡接收到有效载荷,它就会通过网络传输读取的数据。成功传输后,NIC从目标NIC接收确认(ACK)。

步骤5:接收到ACK后,NIC将通过DMA方式write(使用MWr TLP)一个完[成队列条目](CQE;vbers中称为COOKIE;Mellanox InfiniBand中为64字节)到与TxQ关联的CQ。然后CPU将轮询此CQE进行判断和后续。

总之,每个post的关键数据路径需要一次 MMIO 写入、两次 DMA 读取和一次 DMA 写入。DMA-reads转换为昂贵的往返 PCIe 延迟。例如,ThunderX2 机器的往返 PCIe 延迟约为 125 纳秒。

(一次 MMIO 写入:对映射内存的写入、两次 DMA 读取:第一次读取MD,第二次根据MD 读取负载和一次 DMA 写入:写入WC)

(ibv_post_send: 将wr 放到 SQ。驱动程序也将(处理过后)wr写入内存映射位置并通知网卡,网卡DMA读取wr,从wr里面得知待发送是数据在本地的地址和要发送到对端的地址。网卡根据本地地址从映射内存读取数据将其传输到对端地址)


操作特性

内联/inlining、Postlist、unsigned completion和Programmed I/O是IB的操作特性,有助于减少这种开销。考虑到QP的深度为n,将在下面描述它们。

  • Postlist:IB允许应用程序通过一个调用ibv_post_send来发布WQE的链接列表,而不是每次只发布一个WQE。它可以将门铃响的次数从n减少到1。
  • INLINE/内联:这里,CPU(网络驱动程序)将数据复制到WQE中 (WD ?)。因此,通过对WQE的第一次DMA读取,NIC也获得了有效载荷,从而消除了针对有效载荷的第二次DMA读取。
  • unsigned Completions:IB默认是为每个WQE发送一个完成信号,但IB也允许应用程序关闭指定的WQE的完成(信号),但是注意每隔post  n 个关闭信号的WQE,就要post一个开启完成信号的WQE 。(因为只有产生CQE,程序去读取了CQE之后才会清理发送队列SQ的SQE,如果一直没有CQE产生,则读取不断CQE也不就不会清理发送队列SQ,很快发送队列SQ就会撑满)

关闭Completion可以减少NIC对CQE的DMA writes。此外,应用程序轮询更少的CQE,从而减少了开销。

  • BlueFlame:BlueFlame:BlueFlame 是 Mellanox 的编程 I/O 术语——它与 DoorBell 一起写入 WQE,切断 WQE 本身的 DMA 读取。请注意,BlueFlame 仅在没有 Postlist 的情况下使用。使用 Postlist,NIC 将 DMA 读取链表中的 WQE。

为了减少PCIe往返延迟的开销,开发人员通常将内联和BlueFlame一起用于小消息。它消除了两个PCIe往返延迟。虽然内联和BlueFlame的使用取决于消息大小,但是Postlist和unsigned completion的使用主要依赖于用户的设计选择和应用程序语义。

ibv_fork_init的调用也会对性能有影响

https://blog.csdn.net/bandaoyu/article/details/124327417?spm=1001.2014.3001.5501


推荐阅读
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
author-avatar
yeeling610
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有