系列解讀 SMC-R (二):融合 TCP 與 RDMA 的 SMC-R 通訊 | 龍蜥技術
文/龍蜥社群高效能網路SIG
一、引言
二、通訊流程
如前篇所述,使用 SMC-R 協議有兩種方法。其一,是在應用程式中顯式建立 AF_SMC 族的 socket;其二,是利用 LD_PRELOAD 或 ULP + eBPF 的方式透明的將應用程式中的 AF_INET 族 socket 替換為 AF_SMC 族 socket。我們預設使用 SMC-R 通訊的節點已經載入了 SMC 核心模組,並透過上述方式將應用程式執行在 SMC-R 協議上。接下來, 我們以 first contact (通訊兩端建立首個連線) 場景為例,介紹 SMC-R 通訊流程。
2.1 確認對端能力
使用 SMC-R 通訊時,我們首先需要確認對端是否同樣支援 SMC-R 協議。因此,SMC-R 協議棧為應用程式建立 SMC 型別 socket (smc socket) 的同時,還會在核心建立並維護一個與之關聯的 TCP 型別 socket (clcsock),並基於 clcsock 與對端建立起 TCP 連線。
(圖/TCP 握手確認對端 SMC-R 能力)
在 TCP 連線三次握手中,使用 SMC-R 協議的一端傳送的 SYN/ACK 中攜帶了特殊的 TCP 選項 (Kind = 254,Magic Number = 0xe2d4),用於表明自身支援 SMC-R。透過檢查對端傳送的 SYN/ACK,通訊節點得知其 SMC-R 能力,進而決定是否繼續使用 SMC-R 通訊。
(圖/三次握手攜帶特殊 TCP 選項[1])
(圖/smc-tools 觀測回退現象)
2.3 建立SMC-R 連線
若在 TCP 握手中,兩端均表示支援 SMC-R,則進入 SMC-R 建連流程。SMC-R 連線的建立依賴 TCP 連線傳遞控制訊息,這種控制訊息被稱為 Connection Layer Control (CLC) 訊息。
(圖/使用 CLC 訊息建立 SMC-R 連線)
CLC 訊息的主要職責是同步通訊兩端的 RDMA 資源以及共享記憶體等資訊。使用 CLC 訊息建立 SMC-R 連線的過程與 SSL 握手類似,主要包含 Proposal、Accept、Decline、Confirm 等語義。在建連過程中,若遇到不可恢復的異常 (如 RDMA 資源失效) 導致後續 SMC-R 通訊無法繼續,也將觸發前文所述的協議回退流程。
2.3.1 建立 RDMA 資源
CQ 本質是存放工作完成資訊 (Work Completion, WC) 的佇列。RNIC 完成 WR 後,將完成資訊打包為完成佇列元素 (Completion Queue Element, CQE) 放入 CQ 中。使用者從 CQ 中 poll 出 CQE,獲悉 RNIC 已經完成某個 WR。
2.3.2 建立 RDMA 鏈路
通訊兩端將已建立的 RDMA 資源透過 CLC 訊息同步到對端,進而在兩端之間建立起基於 RC (Reliable Connection) QP 的 RDMA 鏈路。SMC-R 中將這種點對點邏輯上的 RDMA 鏈路稱為 SMC-R Link。一條 SMC-R Link 承載著多條 SMC-R 連線的資料流量。
若通訊節點之間存在不止一對可用的 RNIC,則會建立不止一條 Link。這些 Link 在邏輯上組成一個小組,稱為 SMC-R Link Group。
2.3.3 申請 RDMA 記憶體
SMC-R 協議棧為每條 SMC-R 連線分配了獨屬的收發緩衝區:sndbuf (傳送緩衝區) 與 RMB (接收緩衝區,Remote Memory Buffer)。這是兩片地址連續,長度在 16 KB ~ 512 KB 間的核心態 ring buffer。
(圖/SMC-R 連線 ring buffer)
-
生成地址翻譯表
-
Pin 住記憶體
-
限制記憶體訪問許可權
(圖/sndbuf / RMB 記憶體池)
2.4 驗證 SMC-R Link
由於 first contact 場景下新建立的 SMC-R Link 尚未經過驗證,所以在正式使用 Link 傳輸應用資料前,通訊兩端會基於 Link 傳送 Link Layer Control (LLC) 訊息,用於檢驗 Link 是否可用。
(圖/使用 LLC 訊息確認 SMC Link 可用)LLC 訊息通常為請求-回覆模式,用於傳輸 Link 層面的控制資訊,如新增/刪除/確認 Link,確認/刪除 r_key 等。
LLC 訊息的傳輸基於 RDMA 的 SEND 操作完成,與之相對的是後文提到的 RDMA WRITE 操作。
-
接收端 RDMA 使用者 (SMC-R 核心協議棧) 向本地 RQ 中 Post RWQE,RWQE 中記錄了待接收資料的長度以及預留記憶體地址;
-
傳送端 RDMA 使用者 (SMC-R 核心協議棧) 向本地 SQ 中 Post SWQE,SWQE 中記錄了待傳送資料長度和記憶體地址。傳送端 RNIC 根據 SWQE 記錄的資訊取出相應長度的資料傳送到對端;
-
接收端 RNIC 接收到資料後,取出 RQ 中的第一個 RWQE,依照其中記錄的記憶體地址和長度存放資料;
透過在 Link 上收發 CONFIRM_LINK 型別的 LLC 訊息,通訊兩端確認了新建立的 Link 具備 RDMA 通訊的能力,可以用於傳輸 SMC-R 連線資料。
2.5 基於共享記憶體通訊
應用程式下發到 SMC-R 連線中的資料由關聯的 Link 透過 RDMA WRITE 操作寫入遠端節點 RMB 中。
-
前期準備階段,接收端 RDMA 使用者 (SMC-R 核心協議棧) 將接收緩衝區註冊為 RDMA 記憶體,將遠端訪問金鑰 rkey 告知傳送端,使其擁有直接訪問接收端記憶體的許可權,這個過程我們在前文介紹過。
-
傳送端 RDMA 使用者 (SMC-R 核心協議棧) 向 SQ 中 post SWQE。與 SEND 不同的是,RDMA WRITE 的 SWQE 中不僅包含資料在本地的記憶體地址和長度,還包含資料即將存放在接收端的記憶體地址,以及訪問接收端記憶體所需的 r_key。傳送端 RNIC 根據 SWQE 中記錄的資訊將資料傳輸到接收端。
-
接收端 RNIC 核實資料包中的 r_key,將資料存放到指定記憶體地址中。此時的接收端 RDMA 使用者並不知道資料已經被寫入記憶體。
在系列文章的第一篇中我們提到,SMC-R 名稱中的“共享記憶體”指的是接收端的 RMB。結合上述的 RDMA WRITE 操作與 CDC 訊息,SMC-R 的共享記憶體通訊流程可以總結為:
-
傳送端的資料透過 socket 介面,由應用緩衝區複製至核心 sndbuf 中 (圖中未畫出 sndbuf)
-
協議棧透過 RDMA WRITE 單邊操作將資料寫入接收端 RMB 中
-
傳送端透過 SEND 雙邊操作傳送 CDC 訊息告知接收端有新的資料到來
-
接收端從 RMB 中複製資料至應用緩衝區
-
接收端透過 SEND 雙邊操作傳送 CDC 訊息告知傳送端 RMB 中部分資料已被使用
2.6 連線關閉與資源銷燬
若 Link (Group) 中不再存在活躍的 SMC-R 連線,則等待一段時間後 (Linux 實現中為 10 mins) 進入Link (Group) 銷燬流程。銷燬 Link (Group) 將釋放與之相關的所有 RDMA 資源,包括 QP、CQ、PD、MR、以及所有的 sndbuf 與 RMB。Link (Group) 銷燬後,再次建立 SMC-R 連線則需要重新經歷 first contact 流程。
三、總結
參考說明:
[1]連結可移步龍蜥公眾號(OpenAnolis龍蜥)2022年4月20日相同推送檢視。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70004278/viewspace-2888245/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 系列解讀SMC-R:透明無感提升雲上 TCP 應用網路效能(一)| 龍蜥技術TCP
- 效能提升 57% ,SMC-R 透明加速 TCP 實戰解析 | 龍蜥技術TCP
- 虛擬化解決方案 virtio 的技術趨勢與 DPU 實踐解讀 | 龍蜥技術
- 深入解讀雲場景下的網路抖動 | 龍蜥技術
- 基於 SmartX 分散式儲存的 RDMA 與 TCP/IP 技術與效能對比分散式TCP
- 技術解讀:Dragonfly 基於 P2P 的智慧映象加速系統 | 龍蜥技術Go
- 一文解讀機密容器的崛起和發展 | 龍蜥技術
- 深入解讀基礎軟體雲原生面臨的挑戰 | 龍蜥技術
- 技術門檻高?來看 Intel 機密計算技術在龍蜥社群的實踐 | 龍蜥技術Intel
- 技術解讀倚天 ECS 例項——Arm 晶片的 Python-AI 算力最佳化 | 龍蜥技術晶片PythonAI
- 呼叫鏈系列二:解讀UAVStack中的呼叫鏈技術
- 技術解讀:現代化工具鏈在大規模 C++ 專案中的運用 | 龍蜥技術C++
- 如何解讀wlan的通訊技術?
- 跨語言程式設計的探索 | 龍蜥技術程式設計
- 助力Koordinator雲原生單機混部,龍蜥混部技術提升CPU利用率達60%|龍蜥技術
- 萬里資料庫加入龍蜥社群,打造基於“龍蜥+GreatSQL”的開源技術底座資料庫SQL
- 龍蜥利器:系統運維工具 SysAK的雲上應用效能診斷 | 龍蜥技術運維
- 螞蟻安全科技 Nydus 與 Dragonfly 映象加速實踐 | 龍蜥技術Go
- 利器解讀!Linux 核心調測中最最讓開發者頭疼的 bug 有解了|龍蜥技術Linux
- eBPF 雙子座:天使 or 惡魔?| 龍蜥技術eBPF
- 龍蜥社群高效能儲存技術 SIG 11 月運營回顧 | 龍蜥 SIG
- 龍蜥開源Plugsched:首次實現 Linux kernel 排程器熱升級 | 龍蜥技術Linux
- ModBus RTU與ModBus TCP通訊協議詳解TCP協議
- GaussDB技術解讀系列:效能調優
- Tair持久儲存系列技術解讀AI
- 浪潮資訊AI演算法研究員:解讀人工智慧大模型在產業中的服務新態勢 | 龍蜥技術AI演算法人工智慧大模型產業
- 龍蜥開源核心追蹤利器 Surftrace:協議包解析效率提升 10 倍! | 龍蜥技術協議
- 全面解讀DDS和TSN融合技術及其測試方案
- DPU 廠商北中網芯加入龍蜥社群,共建網路通訊與安全
- 浪潮資訊工程師:帶你瞭解裝置透傳虛擬機器的快速啟動技術最佳化方案 | 龍蜥技術工程師虛擬機
- TCP通訊TCP
- 基於 Coolbpf 的應用可觀測實踐 | 龍蜥技術
- SysOM 案例解析:消失的記憶體都去哪了 !| 龍蜥技術記憶體
- 中興通訊攜手龍蜥社群,共創繁榮生態 | 2023龍蜥作業系統大會作業系統
- 聯想超融合加入龍蜥社群,多產品完成與 Anolis OS 適配
- 如何實現使用者通訊授權的可信、可知、可追溯?——通訊授權服務技術解讀
- 呼叫鏈系列三:解讀UAVStack中的呼叫鏈技術
- 呼叫鏈系列一:解讀UAVStack中的呼叫鏈技術