什么是RDMA?

什么是RDMA?

RDMA(RemoteDirect Memory Access)技術全稱遠程直接內存訪問,就是為了解決網絡傳輸中服務器端數據處理的延遲而產生的。它將數據直接從一臺計算機的內存傳輸到另一臺計算機,無需雙方操作系統的介入。這允許高吞吐、低延遲的網絡通信,尤其適合在大規模并行計算機集群中使用。RDMA通過網絡把資料直接傳入計算機的存儲區,將數據從一個系統快速移動到遠程系統存儲器中,而不對操作系統造成任何影響,這樣就不需要用到多少計算機的處理能力。它消除了外部存儲器復制和上下文切換的開銷,因而能解放內存帶寬和CPU周期用于改進應用系統性能。

本次詳解我們從三個方面詳細介紹RDMA:RDMA背景、RDMA相關工作、RDMA技術詳解。

背景介紹

傳統TCP/IP通信模式

傳統的TCP/IP網絡通信,數據需要通過用戶空間發送到遠程機器的用戶空間。數據發送方需要講數據從用戶應用空間Buffer復制到內核空間的Socket Buffer中。然后Kernel空間中添加數據包頭,進行數據封裝。通過一系列多層網絡協議的數據包處理工作,這些協議包括傳輸控制協議(TCP)、用戶數據報協議(UDP)、互聯網協議(IP)以及互聯網控制消息協議(ICMP)等。數據才被Push到NIC網卡中的Buffer進行網絡傳輸。消息接受方接受從遠程機器發送的數據包后,要將數據包從NIC buffer中復制數據到Socket Buffer。然后經過一些列的多層網絡協議進行數據包的解析工作。解析后的數據被復制到相應位置的用戶應用空間Buffer。這個時候再進行系統上下文切換,用戶應用程序才被調用。以上就是傳統的TCP/IP協議層的工作。

如今隨著社會的發展,我們希望更快和更輕量級的網絡通信。

通信網絡定義

計算機網絡通信中最重要兩個衡量指標主要是指高帶寬和低延遲。通信延遲主要是指:處理延遲和網絡傳輸延遲。處理延遲開銷指的就是消息在發送和接收階段的處理時間。網絡傳輸延遲指的就是消息在發送和接收方的網絡傳輸時延。如果網絡通信狀況很好的情況下,網絡基本上可以 達到高帶寬和低延遲。

當今網絡現狀

當今隨著計算機網絡的發展。消息通信主要分為兩類消息,一類是Large messages,在這類消息通信中,網絡傳輸延遲占整個通信中的主導位置。還有一類消息是Small messages,在這類消息通信中,消息發送端和接受端的處理開銷占整個通信的主導地位。然而在現實計算機網絡中的通信場景中,主要是以發送小消息為主。所有說發送消息和接受消息的處理開銷占整個通信的主導的地位。具體來說,處理開銷指的是buffer管理、在不同內存空間中消息復制、以及消息發送完成后的系統中斷。

傳統TCP/IP存在的問題

傳統的TPC/IP存在的問題主要是指I/O bottleneck瓶頸問題。在高速網絡條件下與網絡I/O相關的主機處理的高開銷限制了可以在機器之間發送的帶寬。這里感興趣的高額開銷是數據移動操作和復制操作。具體來講,主要是傳統的TCP/IP網絡通信是通過內核發送消息。Messaging passing through kernel這種方式會導致很低的性能和很低的靈活性。性能低下的原因主要是由于網絡通信通過內核傳遞,這種通信方式存在的很高的數據移動和數據復制的開銷。并且現如今內存帶寬性相較如CPU帶寬和網絡帶寬有著很大的差異。很低的靈活性的原因主要是所有網絡通信協議通過內核傳遞,這種方式很難去支持新的網絡協議和新的消息通信協議以及發送和接收接口。

相關工作

高性能網絡通信歷史發展主要有以下四個方面:TCP Offloading Engine(TOE)User-Net Networking(U-Net)Virtual interface Architecture(VIA)Remote Direct Memroy Access(RDMA)。U-Net是第一個跨過內核網絡通信的模式之一。VIA首次提出了標準化user-level的網絡通信模式,其次它組合了U-Net接口和遠程DMA設備。RDMA就是現代化高性能網絡通信技術。

TCP Offloading Engine

在主機通過網絡進行通信的過程中,主機處理器需要耗費大量資源進行多層網絡協議的數據包處理工作,這些協議包括傳輸控制協議(TCP)、用戶數據報協議(UDP)、互聯網協議(IP)以及互聯網控制消息協議(ICMP)等。由于CPU需要進行繁重的封裝網絡數據包協議,為了將占用的這部分主機處理器資源解放出來專注于其他應用,人們發明了TOE(TCP/IP Offloading Engine)技術,將上述主機處理器的工作轉移到網卡上。

這種技術需要特定網絡接口-網卡支持這種Offloading操作。這種特定網卡能夠支持封裝多層網絡協議的數據包,這個功能常見于高速以太網接口上,如吉比特以太網(GbE)或10吉比特以太網(10GbE)。

User-Net Networking(U-Net)

U-Net的設計目標是將協議處理部分移動到用戶空間去處理。這種方式避免了用戶空間將數據移動和復制到內核空間的開銷。它的設計宗旨就是移動整個協議棧到用戶空間中去,并且從數據通信路徑中徹底刪除內核。這種設計帶來了高性能的提升和高靈活性的提升。

U-Net的virtual NI 為每個進程提供了一種擁有網絡接口的錯覺,內核接口只涉及到連接步驟。傳統上的網絡,內核控制整個網絡通信,所有的通信都需要通過內核來傳遞。U-Net應用程序可以通過MUX直接訪問網絡,應用程序通過MUX直接訪問內核,而不需要將數據移動和復制到內核空間中去。

RDMA詳解

RDMA(Remote Direct Memory Access)技術全稱遠程直接內存訪問,就是為了解決網絡傳輸中服務器端數據處理的延遲而產生的。RDMA通過網絡把資料直接傳入計算機的存儲區,將數據從一個系統快速移動到遠程系統存儲器中,而不對操作系統造成任何影響,這樣就不需要用到多少計算機的處理功能。它消除了外部存儲器復制和上下文切換的開銷,因而能解放內存帶寬和CPU周期用于改進應用系統性能。

RDMA主要有以下三個特性:1.Low-Latency 2.Low CPU overhead 3. high bandwidth

RDMA 簡介

Remote:數據通過網絡與遠程機器間進行數據傳輸

Direct:沒有內核的參與,有關發送傳輸的所有內容都卸載到網卡上

Memory:在用戶空間虛擬內存與RNIC網卡直接進行數據傳輸不涉及到系統內核,沒有額外的數據移動和復制

Access:send、receive、read、write、atomic操作

RDMA基本概念

RDMA有兩種基本操作。

Memory verbs: 包括RDMA read、write和atomic操作。這些操作指定遠程地址進行操作并且繞過接收者的CPU。

Messaging verbs:包括RDMA send、receive操作。這些動作涉及響應者的CPU,發送的數據被寫入由響應者的CPU先前發布的接受所指定的地址。

RDMA傳輸分為可靠和不可靠的,并且可以連接和不連接的(數據報)。憑借可靠的傳輸,NIC使用確認來保證消息的按序傳送。不可靠的傳輸不提供這樣的保證。然而,像InfiniBand這樣的現代RDMA實現使用了一個無損鏈路層,它可以防止使用鏈路層流量控制的基于擁塞的損失[1],以及使用鏈路層重傳的基于位錯誤的損失[8]。因此,不可靠的傳輸很少會丟棄數據包。

目前的RDMA硬件提供一種數據報傳輸:不可靠的數據報(UD),并且不支持memory verbs。

RDMA三種不同的硬件實現

目前RDMA有三種不同的硬件實現。分別是InfiniBand、iWarp(internet Wide Area RDMA Protocol)、RoCE(RDMA over Converged Ethernet)。

目前,大致有三類RDMA網絡,分別是Infiniband、RoCE、iWARP。其中,Infiniband是一種專為RDMA設計的網絡,從硬件級別保證可靠傳輸 , 而RoCE 和 iWARP都是基于以太網的RDMA技術,支持相應的verbs接口,如圖1所示。從圖中不難發現,RoCE協議存在RoCEv1和RoCEv2兩個版本,主要區別RoCEv1是基于以太網鏈路層實現的RDMA協議(交換機需要支持PFC等流控技術,在物理層保證可靠傳輸),而RoCEv2是以太網TCP/IP協議中UDP層實現。從性能上,很明顯Infiniband網絡最好,但網卡和交換機是價格也很高,然而RoCEv2和iWARP僅需使用特殊的網卡就可以了,價格也相對便宜很多。

Infiniband,支持RDMA的新一代網絡協議。 由于這是一種新的網絡技術,因此需要支持該技術的NIC和交換機。

RoCE,一個允許在以太網上執行RDMA的網絡協議。 其較低的網絡標頭是以太網標頭,其較高的網絡標頭(包括數據)是InfiniBand標頭。 這支持在標準以太網基礎設施(交換機)上使用RDMA。 只有網卡應該是特殊的,支持RoCE。

iWARP,一個允許在TCP上執行RDMA的網絡協議。 IB和RoCE中存在的功能在iWARP中不受支持。 這支持在標準以太網基礎設施(交換機)上使用RDMA。 只有網卡應該是特殊的,并且支持iWARP(如果使用CPU卸載),否則所有iWARP堆棧都可以在SW中實現,并且喪失了大部分RDMA性能優勢。

RDMA技術

傳統上的RDMA技術設計內核封裝多層網絡協議并且涉及內核數據傳輸。RDMA通過專有的RDMA網卡RNIC,繞過內核直接從用戶空間訪問RDMA enabled NIC網卡。RDMA提供一個專有的verbs interface而不是傳統的TCP/IP Socket interface。要使用RDMA首先要建立從RDMA到應用程序內存的數據路徑 ,可以通過RDMA專有的verbs interface接口來建立這些數據路徑,一旦數據路徑建立后,就可以直接訪問用戶空間buffer。

RDMA整體系統架構圖

上述介紹的是RDMA整體框架架構圖。從圖中可以看出,RDMA在應用程序用戶空間,提供了一系列verbs interface接口操作RDMA硬件。RDMA繞過內核直接從用戶空間訪問RDMA 網卡(RNIC)。RNIC網卡中包括Cached Page Table Entry,頁表就是用來將虛擬頁面映射到相應的物理頁面。

RDMA技術詳解

RDMA 的工作過程如下:

1)當一個應用執行RDMA 讀或寫請求時,不執行任何數據復制.在不需要任何內核內存參與的條件下,RDMA 請求從運行在用戶空間中的應用中發送到本地NIC( 網卡)。

2) NIC 讀取緩沖的內容,并通過網絡傳送到遠程NIC。

3) 在網絡上傳輸的RDMA 信息包含目標虛擬地址、內存鑰匙和數據本身.請求既可以完全在用戶空間中處理(通過輪詢用戶級完成排列) ,又或者在應用一直睡眠到請求完成時的情況下通過系統中斷處理.RDMA 操作使應用可以從一個遠程應用的內存中讀數據或向這個內存寫數據。

4) 目標NIC 確認內存鑰匙,直接將數據寫人應用緩存中.用于操作的遠程虛擬內存地址包含在RDMA 信息中。

RDMA操作細節

RDMA提供了基于消息隊列的點對點通信,每個應用都可以直接獲取自己的消息,無需操作系統和協議棧的介入。

消息服務建立在通信雙方本端和遠端應用之間創建的Channel-IO連接之上。當應用需要通信時,就會創建一條Channel連接,每條Channel的首尾端點是兩對Queue Pairs(QP)。每對QP由Send Queue(SQ)和Receive Queue(RQ)構成,這些隊列中管理著各種類型的消息。QP會被映射到應用的虛擬地址空間,使得應用直接通過它訪問RNIC網卡。除了QP描述的兩種基本隊列之外,RDMA還提供一種隊列Complete Queue(CQ),CQ用來知會用戶WQ上的消息已經被處理完。

RDMA提供了一套軟件傳輸接口,方便用戶創建傳輸請求Work Request(WR),WR中描述了應用希望傳輸到Channel對端的消息內容,WR通知QP中的某個隊列Work Queue(WQ)。在WQ中,用戶的WR被轉化為Work Queue Element(WQE)的格式,等待RNIC的異步調度解析,并從WQE指向的Buffer中拿到真正的消息發送到Channel對端。

RDAM單邊操作 (RDMA READ)

READ和WRITE是單邊操作,只需要本端明確信息的源和目的地址,遠端應用不必感知此次通信,數據的讀或寫都通過RDMA在RNIC與應用Buffer之間完成,再由遠端RNIC封裝成消息返回到本端。

對于單邊操作,以存儲網絡環境下的存儲為例,數據的流程如下:

1. 首先A、B建立連接,QP已經創建并且初始化。

2. 數據被存檔在B的buffer地址VB,注意VB應該提前注冊到B的RNIC (并且它是一個Memory Region) ,并拿到返回的local key,相當于RDMA操作這塊buffer的權限。

3. B把數據地址VB,key封裝到專用的報文傳送到A,這相當于B把數據buffer的操作權交給了A。同時B在它的WQ中注冊進一個WR,以用于接收數據傳輸的A返回的狀態。

4. A在收到B的送過來的數據VB和R_key后,RNIC會把它們連同自身存儲地址VA到封裝RDMA READ請求,將這個消息請求發送給B,這個過程A、B兩端不需要任何軟件參與,就可以將B的數據存儲到A的VA虛擬地址。

5. A在存儲完成后,會向B返回整個數據傳輸的狀態信息。

單邊操作傳輸方式是RDMA與傳統網絡傳輸的最大不同,只需提供直接訪問遠程的虛擬地址,無須遠程應用的參與其中,這種方式適用于批量數據傳輸。

RDMA 單邊操作 (RDMA WRITE)

對于單邊操作,以存儲網絡環境下的存儲為例,數據的流程如下:

1. 首先A、B建立連接,QP已經創建并且初始化。

2. 數據remote目標存儲buffer地址VB,注意VB應該提前注冊到B的RNIC(并且它是一個Memory Region),并拿到返回的local key,相當于RDMA操作這塊buffer的權限。

3. B把數據地址VB,key封裝到專用的報文傳送到A,這相當于B把數據buffer的操作權交給了A。同時B在它的WQ中注冊進一個WR,以用于接收數據傳輸的A返回的狀態。

4. A在收到B的送過來的數據VB和R_key后,RNIC會把它們連同自身發送地址VA到封裝RDMA WRITE請求,這個過程A、B兩端不需要任何軟件參與,就可以將A的數據發送到B的VB虛擬地址。

5. A在發送數據完成后,會向B返回整個數據傳輸的狀態信息。

單邊操作傳輸方式是RDMA與傳統網絡傳輸的最大不同,只需提供直接訪問遠程的虛擬地址,無須遠程應用的參與其中,這種方式適用于批量數據傳輸。

RDMA 雙邊操作 (RDMA SEND/RECEIVE)

RDMA中SEND/RECEIVE是雙邊操作,即必須要遠端的應用感知參與才能完成收發。在實際中,SEND/RECEIVE多用于連接控制類報文,而數據報文多是通過READ/WRITE來完成的。

對于雙邊操作為例,主機A向主機B(下面簡稱A、B)發送數據的流程如下:

1. 首先,A和B都要創建并初始化好各自的QP,CQ

2. A和B分別向自己的WQ中注冊WQE,對于A,WQ=SQ,WQE描述指向一個等到被發送的數據;對于B,WQ=RQ,WQE描述指向一塊用于存儲數據的Buffer。

3. A的RNIC異步調度輪到A的WQE,解析到這是一個SEND消息,從Buffer中直接向B發出數據。數據流到達B的RNIC后,B的WQE被消耗,并把數據直接存儲到WQE指向的存儲位置。

4. AB通信完成后,A的CQ中會產生一個完成消息CQE表示發送完成。與此同時,B的CQ中也會產生一個完成消息表示接收完成。每個WQ中WQE的處理完成都會產生一個CQE。

雙邊操作與傳統網絡的底層Buffer Pool類似,收發雙方的參與過程并無差別,區別在零拷貝、Kernel Bypass,實際上對于RDMA,這是一種復雜的消息傳輸模式,多用于傳輸短的控制消息。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81535.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81535.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81535.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

golang 安裝gin包、創建路由基本總結

文章目錄 一、安裝gin包和熱加載包二、路由簡單場景總結 一、安裝gin包和熱加載包 首先終端新建一個main.go然后go mod init ‘項目名稱’執行以下命令 安裝gin包 go get -u github.com/gin-gonic/gin終端安裝熱加載包 go get github.com/pilu/fresh終端輸入fresh 運行 &…

【數據結構篇】鏈式結構二叉樹

目錄: 一 二叉鏈的概念與結構: 1.1 概念: 1.2 結構: 二 二叉鏈的實現: 2.1 二叉樹的構建: 2.2 二叉樹的遍歷: 2.2.1 前序遍歷: 2.2.2 中序遍歷: 2.2.3 后序遍歷…

【MySQL】02.數據庫基礎

1. 數據庫的引入 之前存儲數據用文件就可以了,為什么還要弄個數據庫? 文件存儲存在安全性問題,文件不利于數據查詢和管理,文件不利于存儲海量數據,文件在程序中控制不方便。而為了解決上述問題,專家們設計出更加利于…

什么是 Langchain 以及其核心組件

LangChain 官方文檔:LangChain 一、什么是Langchain LangChain 是一個用于構建基于LLM的應用框架,它提供了對 LLM API 的封裝和擴展,使開發者能夠更方便地構建復雜的應用。 個人理解:用類比的方法來說,LangChain類似…

博客系統功能測試

博客系統網址:http://8.137.19.140:9090/blog_list.html 主要測試內容 功能測試、界面測試、性能測試、易用性測試、安全測試、兼容性測試、弱網測試、安裝卸載測試、壓力測試… 測試方法及目的 利用selenium和python編寫測試腳本,對博客系統進行的相關…

項目制作流程

一、使用 CRA 創建項目 npx create-react-app name 二、按照業務規范整理項目目錄 (重點src目錄) 三、安裝插件 npm install sass -Dnpm install antd --savenpm install react-router-dom 四、配置基礎路由 Router 1. 安裝路由包 react-router-dom …

ngx_http_random_index_module 模塊概述

一、使用場景 隨機內容分發 當同一目錄下存放多份等價內容(如多張輪播圖、不同版本靜態頁面等)時,可通過隨機索引實現負載均衡或流量分散。A/B 測試 通過目錄請求自動隨機分配用戶到不同測試組,無需后端邏輯參與。動態“首頁”選…

智能權限守護者:基于Python描述符的動態角色控制實現

智能權限守護者:基于Python描述符的動態角色控制實現 引言:當描述符遇見權限管理 在Python的魔法方法體系中,描述符(Descriptor)以其優雅的屬性訪問控制機制著稱。當我們將描述符與RBAC(基于角色的訪問控制)模型結合,就能創造出既靈活又安全的動態權限管理系統。本文…

Linux 的 UDP 網絡編程 -- 回顯服務器,翻譯服務器

目錄 1. 回顯服務器 -- echo server 1.1 相關函數介紹 1.1.1 socket() 1.1.2 bind() 1.1.3 recvfrom() 1.1.4 sendto() 1.1.5 inet_ntoa() 1.1.6 inet_addr() 1.2 Udp 服務端的封裝 -- UdpServer.hpp 1.3 服務端代碼 -- UdpServer.cc 1.4 客戶端代碼 -- UdpClient.…

Linux 內核等待機制詳解:prepare_to_wait_exclusive 與 TASK_INTERRUPTIBLE

1. prepare_to_wait_exclusive 函數解析 1.1 核心作用 prepare_to_wait_exclusive 是 Linux 內核中用于將進程以獨占方式加入等待隊列的關鍵函數,其主要功能包括: 標記獨占等待:通過設置 WQ_FLAG_EXCLUSIVE 標志,表明此等待條目是獨占的。 安全入隊:在自旋鎖保護下,將條…

【Android構建系統】了解Soong構建系統

背景介紹 在Android7.0之前,Android使用GNU Make描述和執行build規則。Android7.0引入了Soong構建系統,彌補Make構建系統在Android層面變慢、容易出錯、無法擴展且難以測試等缺點。 Soong利用Kati GNU Make克隆工具和Ninja構建系統組件來加速Android的…

信息學奧賽一本通 1539:簡單題 | 洛谷 P5057 [CQOI2006] 簡單題

【題目鏈接】 ybt 1539:簡單題 洛谷 P5057 [CQOI2006] 簡單題 【題目考點】 1. 樹狀數組 模板題及講解:洛谷 P3374 【模板】樹狀數組 【解題思路】 解法1:樹狀數組 該有01構成數組初值都為0。 某位置的元素被修改奇數次后值為1&#x…

倉頡開發語言入門教程:搭建開發環境

倉頡開發語言作為華為為鴻蒙系統自研的開發語言,雖然才發布不久,但是它承擔著極其重要的歷史使命。作為鴻蒙開發者,掌握倉頡開發語言將成為不可或缺的技能,今天我們從零開始,為大家分享倉頡語言的開發教程,…

玉米籽粒發育

成熟玉米籽粒的結構 玉米籽粒的組成 成熟的玉米籽粒主要由以下三部分組成: 母體組織:包括種皮、胎座和花梗。種皮由珠被發育而來,起到保護種子的作用,并在種子的休眠和萌發中發揮重要作用。胚:包含根分生組織、莖分…

sherpa-ncnn:音頻處理跟不上采集速度 -- 語音轉文本大模型

目錄 1. 問題報錯2. 解決方法 1. 問題報錯 報錯: An overrun occurred, which means the RTF of the current model on your board is larger than 1. You can use ./bin/sherpa-ncnn to verify that. Please select a smaller model whose RTF is less than 1 fo…

Postman一直打不開的解決辦法

Postman 是一款非常流行的開源 API 開發工具,主要用于構建、測試、調試和文檔化應用程序接口(API)。但有時它的性能不會特別穩定,功能限制和擴展性不足;應用于開發、測試、運維等環節,尤其在開發 RESTful A…

問題|對只允許輸入的變量是否進行了更改

“對只允許輸入的變量是否進行了更改”這一問題的核心是:在編程中,某些變量被設計為僅用于輸入(只讀),但在代碼中可能被意外修改,導致潛在錯誤。以下是詳細解釋: 1. 什么是“只允許輸入的變量”…

RPC與SOAP的區別

一.RPC(遠程過程調用)和SOAP(簡單對象訪問協議)均用于實現分布式系統中的遠程通信,但兩者在設計理念、協議實現及應用場景上存在顯著差異。 二.對比 1.設計理念 2.協議規范 3.技術特性 4.典型應用場景 5.總結 三.總結…

c#的內存指針操作(僅用于記錄)

c#也可以直接操作內存指針,如下為示例: unsafe {byte[] a {1,2,3};fixed (byte* p1 a, p2 &a[^1]){Debugger.Log(1, "test", $"max index:{p2-p1}");Debugger.Log(1, "test", $"address:{(long)p1:X}")…

Jsp技術入門指南【十三】基于 JSTL SQL 標簽庫實現 MySQL 數據庫連接與數據分頁展示

Jsp技術入門指南【十三】基于 JSTL SQL 標簽庫實現 MySQL 數據庫連接與數據分頁展示 前言一、回顧SQL標簽的內容1. 什么是JSTL SQL標簽?2.為什么要用SQL標簽?3.第一步:引入SQL標簽庫4. SQL標簽的核心功能:連接數據庫標簽常用屬性&…