2508C++,支持rdma通信的高性能rpc库

原文

[重磅]支持rdma通信的高性能rpc库–yalantinglibs.coro_rpc

yalantinglibscoro_rpc是基于C++20协程高性能rpc库,提供了简洁易用的接口,让用户几行代码就可实现rpc通信,现在coro_rpc除了支持tcp通信之外还支持了rdma通信(ibverbs).
通过简单示例来感受一下rdma通信的coro_rpc.

示例

启动rpcserver

std::string_view echo(std::string str) { return str; }
coro_rpc_server server(/*thread_number*/ std::thread::hardware_concurrency(), /*端口*/ 9000);
server.register_handler<echo>();
server.init_ibv();//初化rdma资源
server.start();

客户发送rpc请求

Lazy<void> async_request() {coro_rpc_client client{};client.init_ibv();//初化rdma资源co_await client.connect("127.0.0.1:9000");auto result = co_await client.call<echo>("hello rdma");assert(result.value() == "hello rdma");
}
int main() {syncAwait(async_request());
}

几行代码就可完成基于rdma通信的rpcserver客户了.如果用户需要设置更多rdma相关的参数,则可在调用init_ibv时传入配置对象,在该对象中设置ibverbs相关的各种参数.详见文档.

如果要允许tcp通信该怎么做呢?不调用init_ibv()即可,默认就是tcp通信,调用了init_ibv()之后才是rdma通信.

benchmark

180Gbrdma(RoCEV2)带宽环境,两台主机之间对coro_rpc做了一些性能测试,在高并发小包场景下qps可到150w;
发送稍大的数据包时(256K以上)不到10个并发就可轻松打满带宽.

请求数据大小并发数吞吐(Gb/s)P90(us)P99(us)qps
128B10.04242643394
-40.152944149130
-160.404861393404
-640.81100134841342
-2561.472102561533744
4K11.21353937017
-44.503748137317
-1611.646274355264
-6424.47112152745242
-25642.362443121318979
32K18.41394132084
-429.914255114081
-1683.735893319392
-64148.66146186565878
-256182.74568744697849
256K128.59819013634
-4100.079611347718
-16182.5821024287063
-64181.7077686487030
-256180.983072339288359
1M155.081581726566
-4161.9023625419299
-16183.4183288821864
-64184.292976310421969
-256184.90116481177622041
8M178.6484014881171
-4180.88153618402695
-16185.01588860102756
-64185.0123296235522756
-256183.4793184942082733

具体benchmark的代码在此.

RDMA优化性能

RDMA内存池

rdma请求,需要预先注册内存收发数据.在实际测试中,注册rdma内存的成本远大于内存拷贝.相比每次发送或接收数据时注册rdma内存.

最好是,用已注册好内存池缓存rdma内存.每次发起请求时,将数据分成多片来接收/发送,每一片数据的最大长度恰好是预先注册好的内存长度,并从内存池中取出注册好的内存,并在内存块和实际数据地址之间做一次拷贝.

RNR与接收缓冲队列

RDMA直接操作远端内存,当远端内存未准备好时,就会触发一次RNR错误,对RNR错误,或断开,或休息一段时间.
显然避免RNR错误是提高RDMA传输性能和稳定度的关键.

coro_rpc用如下策略解决RNR问题:对每个连接,都准备一个接收缓冲队列.队列中含若干块内存(默认8块*256KB),每当收到一块数据传输完成的通知时,在缓冲队列中,立即补充一块新的内存,并把该块内存提交到RDMA接收队列中.

发送缓冲队列

在发送链路中,最天真思路是,先在RDMA缓冲中拷贝数据,再把它提交到RDMA发送队列.当数据写入到对端后,再重复上述步骤发送下一块数据.

上述步骤有两个瓶颈,第一个是如何并行化内存拷贝和网络传输,第二个是,网卡发送完一块数据,再到CPU提交下一块数据的这段时间,网卡实际上是空闲状态,未能最大化利用带宽.

为了提高发送数据,需要引入发送缓冲的概念.每次读写,不等待对端完成写入,而是在将内存提交到RDMA发送队列后就立即完成发送,让上层代码发送下个请求/数据块,直到未完成发送的数据达到发送缓冲队列的上限.

此时才等待发送请求完成,随后在RDMA发送队列中提交新的内存块.

大数据包,使用上述算法可同时内存拷贝和网络传输,同时因为同时发送多块数据,网卡发送完一片数据到应用层提交新数据块的这段时间,网卡可发送另外一块待发送的数据,从而最大化利用了带宽.

小包写入合并

rdma在发送小数据包时吞吐量相对较低.对小包请求,一个既能提高吞吐又不引入额外延迟的思路是按大数据包合并多个小包.

假如应用层提交了一个发送请求,且此时发送队列已满,则数据不会立即发送到远端,而是临时在缓冲中.此时假如应用层又提交了下个请求,则可将这次请求的数据合并写入到上次数据临时的缓冲中,从而实现数据的合并发送.

内联数据

某些rdma网卡对小数据包,可通过内联数据的方式发送数据,它不需要注册rdma内存,同时可取得更好的传输性能.

coro_rpc数据包小于256字节并且网卡支持内联数据时,会用该方式发送数据.

内存消费控制

RDMA通信需要自己管理内存缓冲.当前,coro_rpc默认使用的内存片大小是256KB.接收缓冲初始大小为8,发送缓冲上限为2,因此单连接的内存消费为10*256KB约为2.5MB.

用户可通过调整缓冲的大小缓冲大小来控制内存的消费.

此外,RDMA内存池同样提供水位配置,来控制内存消费上限.当RDMA内存池的水位过高时,试从该内存池中取新内存的连接会失败并关闭.

使用连接池

高并发场景下,可通过coro_rpc提供的连接池复用连接,这可避免重复创建连接.此外,因为coro_rpc支持连接复用,可将多个小数据包请求提交到同一个连接中,实现pipeline发送,并利用底层的小包写入合并技术提高吞吐.

static auto pool = coro_io::client_pool<coro_rpc::coro_rpc_client>::create(conf.url, pool_conf);
auto ret = co_await pool->send_request([&](coro_io::client_reuse_hint, coro_rpc::coro_rpc_client& client) {return client.send_request<echo>("hello");});
if (ret.has_value()) {auto result = co_await std::move(ret.value());if (result.has_value()) {assert(result.value()=="hello");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93610.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FastAPI + React:现代 Web 前后端分离开发的全栈实践指南

一、为什么选 FastAPI React&#xff1f; 性能&#xff1a;FastAPI 基于 Starlette Uvicorn&#xff0c;QPS 与 Node/Go 同级&#xff0c;实测 3 倍于 Flask&#xff1b;React 虚拟 DOM 代码分割&#xff0c;首屏 < 1.2 s。效率&#xff1a;FastAPI 内置 Swagger/OpenAPI…

嵌入式硬件篇---电平转换电路

电平转换电路是电子电路中用来实现不同电压信号之间转换的关键电路&#xff0c;比如把 3.3V 的信号转换成 5V&#xff0c;或者把 5V 转换成 1.8V&#xff0c;确保不同电压的芯片、模块能正常通信。下面用通俗易懂的方式介绍几种常见的电平转换电路&#xff1a;一、电阻分压电路…

SAP ABAP IS SUPPLIED

效果 此谓词表达式用于检查过程的某个形式参数“para”是否已赋值或被请求使用。如果在调用时实际参数被赋值给了该形式参数&#xff0c;则该表达式为真。 这种关系表达式仅能在函数模块和方法中使用。而对于“para”而言&#xff0c;所有可选的形参都可以进行指定。 加上“NOT…

视频内容提取与AI总结:提升学习效率的实用方法

文章目录1、前言2、方法介绍2.1 B站视频处理方案2.2 通用视频处理方案2.3 AI内容总结3、实际效果4、使用建议5、技术发展趋势6、总结&#x1f343; 作者介绍&#xff1a;25届双非本科网络工程专业&#xff0c;阿里云专家博主&#xff0c;专注于 AI 原理、AI 应用开发、AI 产品设…

JVM 面试精选 20 题

目录1. 什么是 JVM、JDK 和 JRE&#xff1f;它们之间的关系是什么&#xff1f;2. Java 内存区域&#xff08;运行时数据区&#xff09;有哪些&#xff1f;3. 说说你对 JVM 垃圾回收机制的理解。4. 常用的垃圾回收算法有哪些&#xff1f;5. 什么是 Minor GC、Major GC 和 Full G…

CMIP6 气候模式核心特性解析

在全球气候变化研究中&#xff0c;CMIP6&#xff08;第六次耦合模式比较计划&#xff09;的气候模式是关键工具。以下从研发背景与核心能力角度&#xff0c;解析五类主流模式的技术特点与适用场景。 一、主流模式技术特性 1. CanESM5/CanESM5-1&#xff08;加拿大环境与气候变…

【牛客刷题】BM63 跳台阶:三种解法深度解析(递归/DP动态规划/记忆化搜索)

文章目录 一、题目介绍 1.1 题目描述 1.2 示例 二、算法设计思路 2.1 核心问题分析 2.2 斐波那契数列关系 三、流程图 解法1:递归法(自顶向下) 解法2:动态规划(自底向上) 解法3:记忆化搜索(递归优化) 解法4: 优化DP流程(推荐) 四、解法实现 五、复杂度分析对比 六、…

《解构WebSocket断网重连:指数退避算法的前端工业级实践指南》

WebSocket作为客户端与服务器双向通信的核心载体,支撑着从在线协作、金融行情到即时通讯等各类高实时性场景。然而,网络环境的动态变化—从用户设备的Wi-Fi与蜂窝网络切换,到公共网络的临时拥塞,再到服务器的短暂重启—都可能导致WebSocket连接中断,进而引发数据传输停滞、…

医疗洁净间的“隐形助手”:富唯智能复合机器人如何重塑手术器械供应链

当手术刀片在无影灯下传递时&#xff0c;0.01mm的抓取偏差可能意味着感染风险——而富唯智能复合机器人以0.02mm的重复定位精度与99.999%无菌操作的硬实力&#xff0c;正成为高端医疗产线中替代人力的关键技术支点。一、医疗上下料的三大痛点&#xff1a;精度、洁净与连续性1.毫…

《设计模式》工厂方法模式

1.工厂方法模式&#xff08;Factory Method&#xff09;定义 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 1.1 UML图&#xff1a; 主要有4个对象&#xff1a; 抽象工厂&#xff08;Abstract Creator&#xf…

冒泡排序——简单理解和使用

阅前声明&#xff1a;如果想直接了解冒泡排序的简化思想&#xff0c;请跳至文章尾部在介绍之前&#xff0c;我们先看一个用到该功能的实战训练&#xff08;本人也是从中开始认识到冒泡排序这个函数定义&#xff09;对于小白来说&#xff0c;我的思路如下&#xff1a;1.题目中涉…

AI应用商业化加速落地 2025智能体爆发与端侧创新成增长引擎

今年以来&#xff0c;人工智能 (AI) 正在进入从算力投入到云服务消耗再到商业化收入&#xff0c;最终回到算力再投入的良性循环&#xff0c;而 AI 应用的起量正是推动这一飞轮效应的关键。7 月 31 日&#xff0c;国务院常务会议审议通过了《关于深入实施 “人工智能 ” 行动的意…

Pytest测试框架基础及进阶

Pytest测试框架基础# Pytest测试框架介绍# Pytest是Python一款三方测试框架&#xff0c;用于编写和运行单元测试、集成测试和功能测试。Pytest测试框架具有简单、灵活、易于扩展等特点&#xff0c;被广泛应用于Python项目的测试工作中。 Pytest主要特点&#xff1a; 简单易用…

航空装备先进加工工艺与制造技术论坛——2025成都航空装备展

300参展企业 11500㎡展区面积 7大专业展区 12000观众规模15同期会议 160发言嘉宾 5000参会嘉宾 100媒体报道航空工业飞速发展&#xff0c;先进加工工艺与制造技术成为了支撑航空装备性能提升、质量保障和产能优化的核心基石。为探索前沿技术路径、凝聚行业创新力量&#xff0c;…

为什么品牌更愿意为新品打广告?

品牌资源向新品广告倾斜&#xff0c;可以说是市场上的普遍现象。尤其对于没有明星产品的品牌而言&#xff0c;新品推广时企业的重要曝光节点。下面就让我们一同来了解下&#xff0c;为什么品牌更愿意为新品打广告。一、市场需求更充分新品广告往往承担着市场教育的功能&#xf…

电子电气架构 --- 关于整车信息安全的一些思考

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

报错:Eplan无法打开数据库的解决方法

详细报错信息&#xff1a;无法打开数据库 E:\eplan\部件\Microsoft\ESS_part001.mdb。针对64位版本的EPLAN 平台需要使用64位版本的Microsoft Office. 一、报错及解决方法 报错信息&#xff1a;无法打开数据库 E:\eplan\部件\Microsoft\ESS_part001.mdb。针对64位版本的EPLAN 平…

深度学习篇---卷积核的权重

卷积核权重&#xff1a;在深度学习的卷积操作中&#xff0c;“卷积核的权重” 是最核心的概念之一&#xff0c;它决定了卷积核能从图像中 “看到” 什么特征&#xff08;比如边缘、纹理&#xff0c;甚至是眼睛、车轮这样的复杂结构&#xff09;。我们可以把它理解成卷积核的 “…

SMTPman,smtp ssl助力安全高效邮件传输!

SMTPman&#xff0c;smtp ssl助力安全高效邮件传输&#xff01;SMTPman&#xff0c;smtp ssl不仅仅是一种邮件协议方式&#xff0c;更是企业日常运营的重要支撑。通过SMTPman&#xff0c;smtp ssl&#xff0c;用户可以获得更快的投递速度&#xff0c;更稳定的连接&#xff0c;以…

学习日志37 python

1 Python 和 Java 在类属性&#xff08;静态属性&#xff09;和实例属性的处理题目执行以下程序&#xff0c;输出结果为&#xff08;&#xff09; class Base(object):count 0def __init__(self):pass b1 Base() b2 Base() b1.count b1.count 1 print(b1.count,end" …