[RDMA] 高性能非同步的消息傳遞和RPC :Accelio
來自專欄 RDMA6 人贊了文章
1. Introduce
Accelio是一個高性能非同步的可靠消息傳遞和RPC庫,能優化硬體加速。 RDMA和TCP / IP傳輸被實現,並且其他的傳輸也能被實現,如共享存儲器可以利用這個高效和方便的API的優點。Accelio 是 Mellanox 公司的RDMA中間件,用於高性能非同步的可靠消息傳遞和RPC庫。
2. Accelio 設計目標
Accelio提供了一個易於使用的,可靠的,可擴展和高性能的數據/消息傳遞中間件,最大限度地提高現代CPU和網卡硬體的效率,減少將新的擴展應用程序產品推向市場的的時間。
3. Accelio Key Features
- 專註於高性能非同步的API
- 可靠的消息傳遞(端對端)
- 請求/響應(交易)或發送/接收模式
- 提供連接和資源抽象到最大的可擴展性和可用性
- 最大限度地發揮每個線程專用的硬體資源,多線程應用程序的性能
- 旨在最大限度地利用RDMA,硬體卸載和多核CPU的優勢
- 支持多種傳輸選項(RDMA,TCP,..)
- 服務和存儲集群/向外擴展的原生支持
- 小消息合併
- 簡單和抽象的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 locksctx_run/stop Run the event loop in the context ctx_get_poll_params Return Accelio』s single file descriptor to add to external loopsession_create/destroy Create/destroy a session to a remote peerconnect/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 processsend_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 RDMA12. 非同步事件處理
高性能的應用程序使用非同步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
※常規操作之非同步