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
英文地址,請注明出處:http://en.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" …