优化 RDMA 代码的建议和技巧-rdma性能优化技巧-避坑指南

这篇具有很好参考价值的文章主要介绍了优化 RDMA 代码的建议和技巧-rdma性能优化技巧-避坑指南。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

RDMA 被用在很多地方,主要是因为它可以实现高性能。在这篇文章中,我将提供有关如何从多个方面优化 RDMA 代码的建议和技巧

简单的科普下RDMA

什么是RDMA?

DMA 代表直接内存访问。这意味着应用程序可以在 CPU 干预的情况下直接访问(读/写)主机内存。如果您在主机之间执行此操作,它将成为远程直接内存访问 (RDMA)

在阅读有关 RDMA 的内容时,您会注意到一些用于描述其优点的术语。 “零复制 Zero Copy”、“内核绕过 Kernel Bypass”、“协议卸载 Protocol Offload”和“协议加速 Protocol Acceleration”等术语

RDMA 的工作原理

RDMA 的工作原理是通过硬件路径(NIC 和网络)将数据从一台主机上的用户应用程序内存直接复制到另一台主机上的用户应用程序内存中。RDMA是下图中的蓝线(图 3)。绿线描绘了您早已了解的传统 TCP/IP 流量

优化 RDMA 代码的建议和技巧-rdma性能优化技巧-避坑指南,RDMA,网络,服务器,数据库,网络

请注意,如果应用程序驻留在内核空间中,它“仅”绕过操作系统堆栈和系统驱动程序,但这仍然提供了显著的性能提升

零复制和内核绕过

这些术语指的是 RDMA 提供的速度增益,因为与正常的 TCP/IP 行为相比,数据不必多次从应用程序内存缓冲区复制到内核内存缓冲区。RDMA通过其他复制操作传递到 NIC,NIC 通过网络将其发送到其他主机。在另一台主机上,必须发生相反的过程。 NIC 内存缓冲区中的数据被复制到内核空间,并在内核空间中再次复制并发送到用户空间到应用程序内存缓冲区。

您会注意到正在进行大量复制,这是 RDMA 避免的开销(零复制)。通过这样做,还可以避免用户空间和内核空间之间的上下文切换(内核绕过)。这极大地加快了速度。

CPU 卸载/旁路

该工作实际上被卸载到 NIC,因此它绕过了主机的 CPU(CPU Offload 或 Bypass)。这样做有两个优点:

1. 应用程序可以访问(远程)内存,而无需内核和用户空间进程消耗任何主机 CPU 周期进行读写。

2. CPU 中的缓存不会被访问的内存内容填充。

CPU 周期和缓存可用于实际的应用程序工作负载,而不是用于移动数据。其好处通常是 CPU 开销减少 20% 到 25%

传输协议加速

最后,RDMA 可以执行称为协议加速的操作。基于消息的事务以及进行收集/分散(SGL)的能力(读取多个缓冲区并将它们作为一个整体发送,同时将它们写入多个接收缓冲区)加快了实际数据移动的速度。这有很多细节。 SNIA(存储网络行业协会)和学术研究人员的演示文稿和出版物很容易在互联网上获得,并且可能变得相当技术性

结论是 RDMA 协议本质上是很快的。

为什么我们需要它?

除了高性能计算之外,过去十年中我们还看到各种东西方流量持续大幅增长。这始于虚拟化,它与虚拟机移动性一起带来了性能和性能的提升。可扩展性对许多资源(网络、存储、计算)提出了挑战。最重要的是,我们看到超融合基础设施(HCI)、存储复制和其他用例等趋势消耗了更多的带宽。与此同时,随着我们获得更快的存储选项(NVMe、各种类型的 NVDIMM(N、F、P)或英特尔的 3D XPoint),对超低延迟的需求也随之增加,这导致了围绕其功能的新架构。

优化 RDMA 代码的建议和技巧-rdma性能优化技巧-避坑指南,RDMA,网络,服务器,数据库,网络

图 4:毫无疑问,非易失性 DIMM(及其所有变体)将进一步推动对 RDMA 的需求(图片由 DELL 提供)

一般建议

1. 避免在数据路径中使用控制操作

与保留在调用它们的同一上下文中(即不执行上下文切换)并且以优化方式编写的数据操作不同,控制操作(所有创建/销毁/查询/修改)操作非常昂贵, 因为:

  • 大多数时候,他们执行上下文切换

  • 有时他们分配或释放动态内存

  • 有时他们参与访问 RDMA 设备

作为一般经验法则,应避免调用控制操作或减少其在数据路径中的使用。

以下动词(verbs接口)被视为数据操作:

  • ibv_post_send() 发送

  • ibv_post_recv() 接收

  • ibv_post_srq_recv() 共享接收队列

  • ibv_poll_cq() 轮询完成队列

  • ibv_req_notify_cq 通知完成

2. 发布多条 WR 时,一次调用将它们发布到列表中

当用verbs接口ibv_post_*()中的一个, 来发送工作请求WR时,在一次调用中将多个工作请求作为链表发布,而不是每次使用一个工作请求进行多次调用,将提供更好的性能,因为它允许低级驱动程序执行优化。

3. 使用工作完成事件时,在一次调用中确认多个事件

使用事件处理工作完成时,在一个调用中确认多个完成而不是每次调用多个调用将提供更好的性能,因为执行的互斥锁较少。

4. 避免使用许多分散/聚集条目

在工作请求(发送请求或接收请求)中使用多个分散/聚集条目意味着 RDMA 设备将读取这些条目并将读取它们引用的内存。使用一个分散/聚集条目比使用多个分散/聚集条目提供更好的性能。

5. 避免使用围栏(Fence)

设置了栅栏标志的发送请求将被阻止,直到所有先前的 RDMA 读取和原子发送请求完成。这会降低带宽。

6. 避免使用原子操作

原子操作允许以原子方式执行读取-修改-写入。这通常会降低性能,因为这样做通常涉及锁定对内存的访问(取决于实现)。

7. 一次读取多个工作完成情况

ibv_poll_cq()允许一次读取多个完成。如果CQ中的工作完成数小于尝试读取的工作完成数,则意味着CQ为空,无需检查其中是否还有更多工作完成。

8. 设置特定任务或进程的处理器关联性

当使用对称多处理 (SMP) 机器时,将进程绑定到特定的 CPU/核心可以更好地利用 CPU/核心,从而提供更好的性能。按照机器中 CPU/核心的数量执行进程并将进程分布到每个 CPU/核心可能是一个很好的做法。这可以通过“taskset”实用程序来完成。

9. 使用本地 NUMA 节点

在非统一内存访问 (NUMA) 计算机上工作时,将进程绑定到被视为 RDMA 设备的本地 NUMA 节点的 CPU/核心可能会因为更快的 CPU 访问而提供更好的性能。将进程分布到所有本地 CPU/核心可能是一个很好的做法。

10. 使用缓存行对齐的缓冲区

与使用未对齐的内存缓冲区相比,使用缓存行对齐的缓冲区(在 S/G 列表、发送请求、接收请求和数据中)将提高性能;它将减少 CPU 周期数和内存访问次数。

11. 避免进入重传流

重传是性能杀手。RDMA中重传的主要原因有2个:

  • 传输重传 - 远程 QP 未处于可以处理传入消息的状态,即至少未达到 RTR 状态,或移至错误状态

  • RNR重传-响应方有一条消息应该消耗一个接收请求,但接收队列中没有任何接收请求

有些 RDMA 设备提供计数器来指示重试流发生,但并非全部。

当QP进入这些流时,将QP.retry_cnt和QP.rnr_retry设置为零将导致失败(即,带有错误的完成)。

但是,如果无法避免重试流,请在重传之间使用较低(尽可能)的延迟。

提高带宽的手段

1. 找到最适合 RDMA 设备的 MTU

MTU 值指定可以发送的最大数据包有效负载大小(即不包括数据包标头)。根据经验,由于所有 MTU 值的数据包标头大小都相同,因此使用最大可用 MTU 大小将降低每个数据包的“支付价格(负载开销)”;有效负载数据占总使用带宽的百分比将会增加。但是,有些 RDMA 设备可以为低于最大支持值的 MTU 值提供最佳性能。人们应该执行一些测试,以便为他使用的特定设备找到最佳的 MTU。

2. 使用大消息

发送几条大消息比发送大量小消息更有效。在应用程序级别,第一级应该通过 RDMA 收集数据并发送大消息。

3. 处理多个未完成的发送请求

处理多个未完成的发送请求并保持发送队列始终满(即,对于每个轮询的工作完成发布一个新的发送请求)将使 RDMA 设备保持忙碌并防止其闲置。

4. 配置队列对以允许并行进行多个 RDMA 读取和原子操作

如果使用 RDMA 读取或原子操作,建议将 QP 配置为与运行中的多个 RDMA 读取和原子操作配合使用,因为它将提供更高的 BW。

5. 使用发送队列中的选择性信号

在发送队列中使用选择性信号意味着并非每个发送请求在结束时都会产生工作完成,这将减少应处理的工作完成的数量。

降低延迟的手段

1. 使用轮询(polling)读取工作完成情况

为了在工作完成添加到完成队列后立即读取它们,轮询将提供最佳结果(而不是使用工作完成事件)。

2. 以内嵌方式发送小消息

在支持内联发送数据的 RDMA 设备中,内联发送小消息将提供更好的延迟,因为它消除了 RDMA 设备(通过 PCIe 总线)执行额外读取以读取消息有效负载的需要。

3. 在 QP 的超时和 min_rnr_timer 中使用较低的值

在 QP 的超时和 min_rnr_timer 中使用较低的值意味着,如果出现错误并且需要重试(无论是因为远程 QP 没有应答还是没有未完成的接收请求),重传之前的等待时间将简短一点。

4. 如果使用立即数据,请使用 RDMA Write with立即而不是 Send with立即

当发送仅包含立即数据的消息时,带有立即数的 RDMA 写入将比带有立即的发送提供更好的性能,因为后者会导致未完成的已发布接收请求被读取(在响应方),而不仅仅是被消耗。

减少内存消耗的手段

1. 使用共享接收队列 (SRQ)

使用 SRQ 可以节省未完成的接收请求的总数,从而减少消耗的总内存,而不是为每个队列对发布许多接收请求。

2. 注册物理连续内存

寄存器物理连续内存(例如大页)可以允许低级驱动程序执行优化,因为需要较少量的内存地址转换(与 4KB 内存页缓冲区相比)。

3. 将使用的队列大小减少到最小

创建各种队列(队列对、共享接收队列、完成队列)可能会消耗大量内存。人们应该将它们的大小设置为其应用程序所需的最小值。

减少CPU消耗的手段

1. 处理工作完成事件

使用事件读取工作完成将消除在 CQ 上执行持续轮询的需要,因为当工作完成添加到 CQ 时,RDMA 设备将发送事件。

2. 在响应者端处理请求的事件

当在响应者端读取工作完成时,请求事件可以是向请求者提供提示的好方法,表明现在是读取完成的好时机。这减少了已处理的工作完成总数。

3. 与多个队列共享同一个CQ

对多个队列使用相同的 CQ 并减少 CQ 的总数将消除检查多个 CQ 的需要,以便了解未完成的工作请求是否已完成。这可以通过与多个发送队列、多个接收队列或它们的混合共享相同的 CQ 来完成。

提高可扩展性的手段

1. 使用集体算法(collective algorithms), 可参考DAOS中CART的k项树算法

使用集体算法将减少通过线路的消息总数,并减少集群中每个节点将使用的消息和资源总数。有些 RDMA 设备提供特殊的集体卸载操作,有助于降低 CPU 利用率。

2. 使用不可靠数据报 (UD) QP

如果每个节点都需要能够接收消息或向子网中的任何其他节点发送消息,则使用连接的 QP(可靠或不可靠)可能是一个糟糕的解决方案,因为将在每个节点中创建许多 QP。使用 UD QP 更好,因为它可以从子网中的任何其他 UD QP 发送和接收消息。

参考

Nvidia_Mellanox_CX5和6DX系列网卡_RDMA_RoCE_无损和有损_DCQCN拥塞控制_动态连接等详解-一文入门RDMA和RoCE有损无损: Nvidia_Mellanox_CX5和6DX系列网卡_RDMA_RoCE_无损和有损_DCQCN拥塞控制_动态连接等详解-一文入门RDMA和RoCE有损无损-腾讯云开发者社区-腾讯云

  • 分享 撰文: Dotan Barak ,2013年6月8日。2019年3月9日。

​​​​​​Tips and tricks to optimize your RDMA code - RDMAmojo RDMAmojo

晓兵(ssbandjl)

博客: https://cloud.tencent.com/developer/user/5060293/articles | https://logread.cn | https://blog.csdn.net/ssbandjl

欢迎对高性能分布式存储PureFlash, SPDK, RDMA, 等高性能技术感兴趣的朋友加入PureFlash技术交流(群)

晓兵技术杂谈(系列)

https://cloud.tencent.com/developer/user/5060293/video

欢迎对DAOS, SPDK, RDMA等高性能技术感兴趣的朋友加我WX(ssbandjl)进入DAOS技术交流(群)

DAOS汇总: https://cloud.tencent.com/developer/article/2344030文章来源地址https://www.toymoban.com/news/detail-779033.html

到了这里,关于优化 RDMA 代码的建议和技巧-rdma性能优化技巧-避坑指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA实现 RDMA NIC 10G UDP协议栈网卡,纯verilog代码编写,提供工程源码和技术支持

    FPGA实现 NIC 10G 网卡,纯verilog代码编写,提供3套工程源码和技术支持 网络接口控制器(NIC)是计算机与网络进行交互的网关。NIC构成了软件协议栈和网络之间的桥梁,该桥梁的功能定义了网络接口。网络接口的功能以及这些功能的实现都在迅速发展。这些变化是由提高线速和

    2024年02月10日
    浏览(47)
  • RDMA编程实例rdma_cm API

    RDMA编程基础 存储大师班 | RDMA简介与编程基础 -https://zhuanlan.zhihu.com/p/387549948 1. RDMA的学习环境搭建 RDMA需要专门的RDMA网卡或者InfiniBand卡才能使用,学习RDMA而又没有这些硬件设备,可以使用一个软件RDMA模拟环境,softiwarp , - 这是加载地址:https://github.com/zrlio/softiwarp - 这是安

    2024年02月04日
    浏览(21)
  • 一份Node.js性能优化技巧指南

    你是一个踏入后端开发领域的前端爱好者吗?🤔 准备好迎接在Node.js错综复杂的景观中惊险刺激的旅程吧!🎢 在这个探险中,我们将探索后端的无数奇迹,从使用Node.js框架快速创建自己的后端,到应对性能分析、测试,深入内存管理。💻🔍 加入我们,揭开C++插件的奥秘,征服子进程

    2024年02月21日
    浏览(35)
  • 【建议收藏】新到手的电脑Windows10/11系统优化、使用规范和技巧及软件推荐,提升范电脑性能和体验

    目录 一、了解电脑 1. 查看电脑和系统的基本信息  2. 电脑测评 二 、Windows10/11系统优化及设置 1. 控制面板、回收站等桌面图标显示设置 2. 任务栏管理 3. 桌面图标排列 4. 卸载程序 5. 关闭P2P分享(传递优化) 6. 电设置脑为高性能 7.  删除存储中的临时文件 8. 磁盘清理 9.

    2024年02月12日
    浏览(38)
  • RDMA在KVM实现条件

    CPU必须支持 Intel VT-d 或 AMD-Vi(IOMMU)技术 demsg要包含下述两部分 DMAR: Intel(R) Virtualization Technology for Directed I/O DMAR: IOMMU enabled 检查CPU是否支持VT-d或AMD-Vi # dmesg |grep -e  \\\"DMAR\\\"   -e  \\\"IOMMU\\\" |grep -e  \\\"Virtualization\\\"   -e enabled [     0.000000 ] DMAR: IOMMU enabled [     0.001068 ] DMAR-IR: Queued

    2024年01月25日
    浏览(34)
  • 使用libibverbs构建RDMA应用

    Dissecting a Small InfiniBand Application Using the Verbs API Abstract | 摘要 InfiniBand is a switched fabric interconnect. The InfiniBand specification does not define an API. However the OFED package, libibverbs, has become the default API on Linux and Solaris systems. Sparse documentation exists for the verbs API. The simplest InfiniBand program provide

    2024年04月11日
    浏览(31)
  • 聚焦112Gb/s SerDes芯片的AN/LT端口自协商和链路学习,评估验证高速链路的信号质量并分析调优(400/800G高速以太网互联接口,AI加速卡网络RDMA性能测试,交换背板接口性能评估)

    目录 引言 关于使用112G Serdes的100G、200G和400G以太网的简要背景 自动协商的基础知识 基础页和下一页 / Base Page and Next Pages DME基础页(IEEE802.3第73条) 下一页 (IEEE802.3) 下一页(以太网技术联盟) AN过程 优先表决 链路训练 训练帧 链路训练过程 如何使用AN和LT 结论 Freya - Xena的

    2024年02月16日
    浏览(56)
  • RDMA Scatter Gather List详解

    1. 前言 在使用RDMA操作之前,我们需要了解一些RDMA API中的一些需要的值。其中在ibv_send_wr我们需要一个sg_list的数组,sg_list是用来存放ibv_sge元素,那么什么是SGL以及什么是sge呢?对于一个使用RDMA进行开发的程序员来说,我们需要了解这一系列细节。 2. SGE简介 在NVMe over PCIe中

    2024年01月20日
    浏览(36)
  • RDMA vs InfiniBand 网卡接口如何区分?

     (该架构图来源于参考文献)  高性能计算网络,RoCE vs. InfiniBand该怎么选? 新 RoCEv2 标准可实现 RDMA 路由在第三层以太网网络中的传输。RoCEv2 规范将用以太网链路层上的 IP 报头和 UDP 报头替代 InfiniBand 网络层。这样,就可以在基于 IP 的传统路由器之间路由 RoCE。  RoCE v1协议:

    2024年01月25日
    浏览(31)
  • 基于RDMA的云服务能力实践与探索

    01   背景          随着基于大数据大模型构建的数据系统越来越有商业价值,机器学习的玩家也越来越多,数据量越来越大。为解决海量数据在服务器之间的同步效率问题,RDMA(Remote Direct Memory Access) 技术逐渐走进了网络技术人员的视野。RDMA为什么能够成为机器学习中网

    2024年04月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包