[RDMA] 高性能非同步的消息傳遞和RPC :Accelio

[RDMA] 高性能非同步的消息傳遞和RPC :Accelio

來自專欄 RDMA6 人贊了文章

1. Introduce

Accelio是一個高性能非同步的可靠消息傳遞和RPC庫,能優化硬體加速。 RDMA和TCP / IP傳輸被實現,並且其他的傳輸也能被實現,如共享存儲器可以利用這個高效和方便的API的優點。Accelio 是 Mellanox 公司的RDMA中間件,用於高性能非同步的可靠消息傳遞和RPC庫。

2. Accelio 設計目標

Accelio提供了一個易於使用的,可靠的,可擴展和高性能的數據/消息傳遞中間件,最大限度地提高現代CPU和網卡硬體的效率,減少將新的擴展應用程序產品推向市場的的時間。

3. Accelio Key Features

  1. 專註於高性能非同步的API
  2. 可靠的消息傳遞(端對端)
  3. 請求/響應(交易)或發送/接收模式
  4. 提供連接和資源抽象到最大的可擴展性和可用性
  5. 最大限度地發揮每個線程專用的硬體資源,多線程應用程序的性能
  6. 旨在最大限度地利用RDMA,硬體卸載和多核CPU的優勢
  7. 支持多種傳輸選項(RDMA,TCP,..)
  8. 服務和存儲集群/向外擴展的原生支持
  9. 小消息合併
  10. 簡單和抽象的API

4. Who can take advantage of it?

對那些高效的,高性能的,可靠消息傳遞實現的應用,如集群,橫向擴展塊/文件/對象存儲,BigData和NoSQL應用程序,快速消息匯流排等,感興趣的開發商可以使用。

5. Accelio 的結構示意圖

?

Accelio的主層分別是:

?應用程序介面 - 提供易於使用的原語進行快速,可靠的非同步消息隊列或RPC

?連接和會話管理 - 提供可靠的終端到終端的連接等端點,動態連接建立,池,故障恢復和遷移/重定向

?可插拔傳輸層 - 使映射到不同的硬體或軟體傳輸實現

6. Accelio Integration With Other Applications/Projects

Accelio被用作高性能,低延遲,可靠消息/ RPC庫的各種開源和商業產品,客戶項目

支持多種綁定(Kernel C, User Space C/C++, Java, Python (future))。

7. 一個會話/連接建立流程

在建立連接到遠程端點,客戶指定遠程統一資源標識符(URI)。URI包含首選傳輸方式,強制領先的IP地址和可選埠數目,以及可選的資源ID或名稱。

/伺服器端響應會話請求,下列選項之一:

?接受可選屬性的連接

?拒絕連接

?無縫地將連接重定向到一個不同的進程或實體

/成功或重定向響應,客戶端建立一個或多個並聯連接到對端,將試圖重用現有的連接,以減少開銷。

/*會話和連接初始化流程

(1)打開一個會話到遠程資源

--例如「remote-ip:port/resource-name」

(2)伺服器端回應,接受,拒絕或重定向

--用「重定向」負載平衡或遷移資源穿過整個集群(多個節點或進程)

--伺服器提供一個portals列表(IPs+Ports)

--每個portal識別port(IP),然後CPU/Thread去訪問

--伺服器基於round/robin,Hash或者custom logic,可以載入平衡通信通過多個ports/cores

--建立連接(S)和發送/接收郵消息

--可以有多個連接(例如每個客戶端線程1個)

--如果連接已經提供給遠程進程,可重用

--故障/變化上的重建或遷移連接

8. 高級別傳輸流程 - 非同步請求/響應模型(Transaction Delivery API Model)

Accelio提供一個RPC-like的請求/回應事務模式,或可靠消息發送/接收模式。

在事務模式中,發起方發送一個請求,它包含專用應用程序的頭和指向輸入與輸出數據緩衝區的指針,允許零拷貝操作和RDMA。

當請求到達接收端時,它觸發一個回調通知,基於該接收的應用程序處理該事務。當在接收端完成該處理時,它以返回的狀態和數據來發送響應。伺服器端可以非同步操作,並發出響應在其方便的時候,也就是,當所返回的數據是可用的。

發起方可以請求消息到達確認。在這樣的情況下,接收方接受該消息之後,一個確認消息返回到發起方。該確認消息可用於阻擋/同步操作和消息跟蹤。

響應到達時,發起方被通知。在這個時候,發起方的數據緩衝區包含返回的數據,並且回叫應答指向原始請求。

如果傳輸失敗,同樣的傳輸被重新傳輸到已恢復或備用的連接上。

發起方可以要求中止/取消某範圍內的消息(例如,請求超時)。接收方試圖中止操作(如果不執行他們),並以成功或失敗來反應。無論哪種方式,相關的響應不返回到發起方。注意,請求可以通過客戶端(無源)或伺服器(有源)端發出。

發送/接收操作遵循相似的流程去請求/響應,唯獨沒有響應消息。消息從發起方發送,引發回調到接收端,使用可選的確認通知。

9. 本地多線程(多進程)支持

對於客戶端和伺服器端,Accelio支持全並行和多線程操作

--應用程序使用單個CPU核心/線程的時候的性能可以被限制

--當多個線程在使用同一個網路資源,需要複雜的狀態管理和鎖定,這樣會增加應用程序的開銷,並限制其性能和可伸縮性

--Accelio支持全並行為客戶端和伺服器

**每個線程可以被相關聯有獨立的硬體資源(QP的&個CQ)和事件循環,從而無需鎖定,並允許最大的並行

**每個會話可以由多個並聯連接(每個關聯使用不同的CPU線程)組成

**伺服器端可以公開多個portal(IP:port)為相同的資源/服務,每個port可以由不同的CPU線程和事件循環提供服務。

如下圖所示可以直觀Accelio的多線程支持

10. 內存管理

--Accelio管理2種類型緩衝區

**發送/接收緩衝環的頭和小數據(通常4-8KB每個)

**大的緩衝區為大型的IOs和RDMA

--大緩衝區被應用程序的庫來分配和控制

--應用控制緩衝區:

**需要預註冊內存緩衝區(使用reg_mr),並保證零拷貝

--庫控制緩衝區

**可能會在客戶端上有一個copy

**接收端零拷貝(應用程序將得到一個指向接收緩衝區)

**當做完時,請求應用程序來釋放緩衝區(用release_msg)

11. Accelio中的一些主要函數調用

Functionn Description

ctx_create/destroy Open thread context helping accelio to partition data without locks

ctx_run/stop Run the event loop in the context

ctx_get_poll_params Return Accelio』s single file descriptor to add to external loop

session_create/destroy Create/destroy a session to a remote peer

connect/disconnect Open/Close a connection with a remote server/portal

bind/unbind Bind/unbind a server portal with a URL (protocol:ip:port)

accept Accept incoming connection (server side)

reject Reject incoming connection (server side)

redirect Redirect a connection to a different node or portals or process

send_request/response Send a request/response message

send/recv_msg Send/receive memory buffer (like sockets send/recv)

release_msg Release message buffers

reg_mr/dereg_mr Register/deregister application buffers for app controlled RDMA

12. 非同步事件處理

高性能的應用程序使用非同步API來進行多個操作,並利用多種資源並行。

?Accelio以下面的方式處理非同步事件:

1,放置一個回調在事件循環,該事件循環結合來自多個資源的事件。

2,當一個事件,發出的一組操作,諸如從網路接收的消息和寫入到磁碟。

?Accelio內置了epoll的支持。應用程序提供的事件循環是可用的。

?對於最低的消息延遲,Accelio提供了優化事件處理,當一個事件循環處於空閑狀態(一個預定義的時間)時,其會結合忙等待池。

13. Accelio概述與總結

Accelio是一個開源的高性能,非同步,可靠消息傳遞和遠程過程調用(RPC)的庫。對於遠程直接內存訪問(RDMA),TCP / IP和共享內存, Accelio優化硬體加速。 Accelio最大化消息和CPU並行性,同時最大限度地降低CPU的爭用和鎖定。並行和非同步體系結構,無鎖定設計和零數據複製機制,提供每秒無與倫比的傳輸和帶寬性能,以及更低的延遲和CPU開銷。 Accelio保證終端到終端的事務傳遞和執行力,它支持事務請求 - 應答的通信模型。

Accelio通過提供內置的多路徑,實時會話重定向/遷移和集群服務或存儲,解決了擴展性和虛擬化環境的挑戰。管理作為一種模塊化的開源項目,Accelio無縫地延伸到新的功能,實現傳輸和服務。

libxio(又名庫accelio)是一個位於RDMA之上的輕量級消息傳遞庫。該庫為零拷貝消息傳遞和無鎖定可擴展性,提供了非同步消息傳遞設計。

Accelio是一種創新的API,它解決了一些現代計算機,網路和存儲系統主要挑戰,如:

?有效地利用多內核

?強大的橫向擴展

?降低硬體和軟體堆棧開銷

?減少通信開銷和延遲

Accelio提供了一個強大的,靈活的通信和消息傳遞層,從而使得應用程序擴展和中間件快速發展。它能夠整合性能,可用性,管理和安全功能於一體的實現,可用於多種應用。工作促進了Accelio開源社區,供應商可以專註於自己的應用程序的核心附加價值,與開發者在一個更大的社區分享他們的實現和體驗。

這個庫已經停止開發了,在github主頁的issue 部分開發者說由於公司中心轉移,這個庫不開發了,建議用別的庫。


推薦閱讀:

一個關於事件循環的題目
【js-非同步編程】 孤獨的人,不要寫非同步
非同步編程框架Seastar介紹
生成器進化到協程 Part 1
常規操作之非同步

TAG:非同步 | 分散式系統 | 計算機網路 |