Alibaba Cloud Linux 3提供的共用記憶體通訊SMC(Shared Memory Communication)是一種相容socket層、使用共用記憶體技術實現的高效能核心網路通訊協定棧。根據共用記憶體技術的不同,SMC又可以細分為基於Internal Shared Memory(ISM)技術的SMC over DMA(SMC-D)和基於Remote Direct Memory Access(RDMA)技術的SMC over RDMA(SMC-R)。本文為您介紹SMC-R及其使用方法。
背景資訊
SMC-R由IBM於2017年開源至Linux 4.11並持續維護至今,其協議標準可參考IETF RFC 7609。Alibaba Cloud Linux 3作業系統基於阿里雲彈性RDMA(elastic RDMA,簡稱eRDMA)技術首次將SMC-R帶上雲上情境,實現對TCP應用透明無侵入的替換,提供高效能、普惠的軟硬體協同網路。
SMC-R的共用記憶體資料互動模型依賴RDMA提供的記憶體操作原語。RDMA技術將網路通訊協定棧下沉至RDMA網卡(RNIC)實現,使網路節點能夠繞過核心直接存取遠程記憶體。與TCP網路相比,RDMA網路可以減少資料在記憶體間拷貝的次數,降低網路傳輸過程中消耗的CPU資源,進而提高網路吞吐、降低網路時延。兩者協議棧差異如下圖所示:
因此,RDMA被廣泛應用於資料密集型和計算密集型情境中,是高效能運算、機器學習、資料中心、海量儲存等領域的重要解決方案。
過去,RDMA只能在一些資料中心網路中通過網卡和交換器緊密配合使用,部署複雜度高。如今,阿里雲彈性RDMA將複雜的RDMA技術帶到雲上,使普通的ECS使用者也能使用高效能的RDMA傳輸,無需關心底層複雜的網卡、交換器等物理網路環境配置,使其成為一種親民、普惠的技術。
但是,RDMA技術基於IB verbs介面,與常用的POSIX socket介面存在巨大的差異。現有socket應用程式遷移至RDMA網路往往面臨大量的改造,使用RDMA技術仍存在較高的技術門檻。
因此,為了充分挖掘彈性RDMA的潛力,為雲上使用者提供更好的網路效能,Alibaba Cloud Linux 3提供並最佳化了SMC-R。在高效使用RDMA技術的同時,保留對標準TCP應用的相容,使更多的應用無需修改便能享受RDMA所帶來的效能紅利。
核心優勢
SMC-R的優勢主要體現在以下幾點:
高效能
得益於RDMA技術將網路通訊協定棧從核心卸載至硬體網卡,SMC-R相較於TCP協議棧在合適的情境下可獲得更低的時延、更高的輸送量,以及更小的CPU負載。具體表現在:
基於RDMA的硬體卸載。
高效可靠的遠程記憶體直接存取設計。
透明替換
得益於SMC-R對POSIX socket介面的相容以及協議棧透明替換能力,socket應用程式可以在無修改的情況下完成TCP協議棧到SMC-R協議棧的切換,無需額外的應用改造和開發成本。具體表現在:
相容socket介面的共用記憶體通訊。
進程或net namespace維度透明協議替換。
自動協議協商和安全回退機制。
技術架構
SMC-R技術架構說明如下:
協議層次與透明替換
SMC-R工作於核心空間,向上支援使用者態程式通過socket介面描述的網路行為,向下使用IB verbs介面實現RDMA網路傳輸。RDMA資源的使用、管理與維護均由SMC-R協議棧完成,應用程式不會感知到核心中的RDMA實體。技術架構如下圖所示:
Alibaba Cloud Linux 3提供了進程或net namespace維度TCP至SMC-R協議棧透明替換機制。通過LD_PRELOAD或sysctl net.smc.tcp2smc等方式讓網路傳輸運行於SMC-R協議棧,使應用程式無需修改即可享受RDMA帶來的網路效能提升。
自動協商和安全回退
SMC-R具備自動協商、動態回退TCP的能力。建立SMC-R通訊前,協議棧首先在核心中與通訊對端建立TCP串連,在握手過程中使用特殊的TCP選項表明自身支援SMC-R,並確認對端同樣支援SMC-R。
如果協商成功,通訊兩側SMC-R協議棧將建立新的或者複用已有的RDMA資源,建立可用的RDMA RC鏈路。從此網路傳輸將基於RDMA網路完成。
如果協商失敗,例如一側不具備RDMA裝置,SMC-R協議棧將自動回退到TCP協議棧,使用協商時建立的TCP串連完成資料轉送。
說明SMC-R僅支援串連協商期間回退至TCP,但不支援資料轉送過程中的回退。
協商和資料轉送流如下圖所示:
基於RDMA的共用記憶體通訊
完成協議協商並建立串連後,協議棧為SMC-R socket分配一塊用於緩衝待發送資料的環形緩衝區sndbuf和一塊用於緩衝待接收資料的環形緩衝區RMB(Remote Memory Buffer)。
發送端應用程式通過socket介面將待發送資料拷貝到本側sndbuf中,由SMC-R協議棧通過RDMA WRITE操作直接高效地寫入對側節點的RMB中。同時伴隨著使用RDMA SEND/RECV操作互動串連資料管理訊息,用於更新、同步環形緩衝區中的資料遊標。
接收端SMC-R協議棧感知到RMB中填入新資料後,通過epoll等方式告知接收端應用程式將RMB中的資料拷貝到使用者態,完成資料轉送。所以在SMC-R中,RMB充當傳輸過程中的共用記憶體。
資料轉送過程如下圖所示:
應用情境
基於SMC-R的高效能、透明替換等優勢,適用於網路通訊佔比高的情境,該技術的典型應用情境樣本如下:
時延敏感的資料查詢和處理
Redis、Memcached、PostgreSQL等高效能資料查詢與處理的情境,對網路效能有極高的要求。SMC-R為應用提供無侵入式透明替換TCP協議棧的能力,無需應用二次開發和適配,即可為應用提供最高50%的QPS(Queries Per Second)提升。
高吞吐的資料轉送
叢集內的大規模資料互動與傳輸,往往需要佔用大量的頻寬和CPU資源。得益於RDMA技術帶來的遠程記憶體直接存取,SMC-R在相同的吞吐效能下,CPU資源使用顯著低於TCP協議棧,為應用節省更多的計算資源。
SMC-R握手涉及到RDMA資源建立和申請,所以對於頻繁建立、銷毀串連(短連結)情境沒有收益。
SMC-R支援的串連規模受限於如下資源:
執行個體可用的實體記憶體大小。每個SMC-R socket所用的收發緩衝區sndbuf和RMB預設使用物理連續記憶體,在SMC-R串連建立時分配,大小預設為當前net.smc.wmem和net.smc.rmem值。查看方式:
sysctl net.smc.wmem # 每個SMC-R socket sndbuf預設大小,單位:位元組 sysctl net.smc.rmem # 每個SMC-R socket RMB預設大小,單位:位元組
ERI eRDMA規格。SMC-R為串連建立的RDMA資源(例如QP、MR、CQ、PD等)上限由執行個體ERI eRDMA規格決定。
當SMC-R無法擷取到所需資源時將會安全回退到TCP協議,確保資料轉送穩定可靠。
使用說明
Alibaba Cloud Linux 3提供並最佳化了SMC-R核心協議棧,配合SMC-R狀態監控和故障診斷工具,您可以通過以下步驟使用SMC-R:
建立支援ERI的ECS執行個體。
SMC-R基於RDMA實現,因此使用SMC-R前需要建立支援ERI功能的ECS執行個體,以獲得雲上RDMA能力。具體操作,請參見在企業級執行個體上配置eRDMA。
重要阿里雲ERI eRDMA裝置與SMC目前均不支援使用IPv6地址。如果應用程式層使用IPv6地址,會導致SMC回退到TCP協議棧。
執行以下命令,載入
smc
和smc_diag
核心模組。modprobe smc modprobe smc_diag
您可以執行
dmesg
命令查看核心列印資訊。如果看到如下資訊,說明載入成功。smc: smc: load SMC module with reserve_mode NET: Registered protocol family 43 smc: netns <netns ID> reserved ports [65500 ~ 65515] for eRDMA OOB smc: adding ib device erdma_0 with port count 1 smc: ib device erdma_0 port 1 has pnetid
說明由於SMC支援ERI eRDMA方式的特殊性,自ANCK 5.10.134-015核心版本起,SMC核心模組載入時將嘗試佔用當前可訪問ERI裝置的net namespace中65500~65515共16個socket連接埠,用於RDMA帶外(OOB)建連。如果連接埠佔用失敗將無法在SMC模組中使用ERI eRDMA裝置(但仍可以載入SMC模組)。卸載SMC模組時將自動解除連接埠佔用。
查看核心版本:
uname -r
SMC模組載入時因連接埠佔用失敗而無法使用ERI eRDMA裝置的
dmesg
警告資訊:smc: smc: load SMC module with reserve_mode NET: Registered protocol family 43 warning: smc: netns <netns ID> reserved ports <佔用失敗的連接埠號碼> FAIL for eRDMA OOB
卸載SMC模組:
rmmod smc_diag rmmod smc
卸載模組時的列印資訊:
NET: Unregistered protocol family 43 smc: removing ib device erdma_0 smc: netns <netns ID> released ports [65500 ~ 65515] used by eRDMA OOB
執行以下命令,安裝SMC的營運工具集smc-tools。
yum install -y smc-tools
(可選)設定收發緩衝區預設大小。
如技術架構:基於RDMA的共用記憶體通訊中所述,SMC-R協議棧會為每個SMC-R socket分配一塊用於緩衝待發送資料的環形緩衝區sndbuf和一塊用於緩衝待接收資料的環形緩衝區RMB。SMC-R中sndbuf與RMB概念可類比於TCP協議中的send buffer與receive buffer,有效值範圍為16 KB到512 KB。
對於注重吞吐效能的網路模型可以通過下述方式調整SMC-R socket sndbuf和RMB的預設大小,以獲得最佳的SMC-R網路加速效果。
Alibaba Cloud Linux 3提供了sysctl net.smc.wmem和sysctl net.smc.rmem來設定當前net namespace中所有建立SMC-R socket的sndbuf和RMB的預設大小,已建立串連的SMC-R socket的sndbuf和RMB不受影響。具體步驟為:
sysctl net.smc.wmem=<sndbuf 指定值,以位元組為單位> sysctl net.smc.rmem=<RMB 指定值,以位元組為單位>
sysctl net.smc.wmem
和sysctl net.smc.rmem
的初始化值為 256 KB。除了上述設定SMC-R socket的sndbuf和RMB預設值的方法,應用程式還可以通過setsockopt()系統調用,在建立串連前設定SMC-R socket的SO_SNDBUF和SO_RCVBUF選項值,進而改變SMC-R socket所使用的sndbuf和RMB大小。
基於SMC協議棧運行TCP socket應用程式。
Alibaba Cloud Linux 3支援兩個維度透明替換。具體說明如下:
net namespace維度透明替換
Alibaba Cloud Linux 3提供了net namespace維度協議透明替換功能,可以通過
sysctl net.smc.tcp2smc
將net namespace中所有符合如下條件的TCP socket替換為SMC socket。family為AF_INET
type為SOCK_STREAM
protocol為IPPROTO_IP或IPPROTO_TCP
替換過程如下圖所示:
在net namespace維度開啟透明替換的操作步驟如下:
執行以下命令,開啟net namespace範圍全域替換開關net.smc.tcp2smc。
sysctl net.smc.tcp2smc=1
預設情況下,
sysctl net.smc.tcp2smc=0
,處在關閉狀態。執行以下命令,在此net namespace中運行TCP socket應用程式。
./foo
此時foo應用程式建立的TCP socket將被透明替換為SMC socket。通過SMC-R協議棧處理應用程式網路行為。如技術架構:自動協商和安全回退中所述,如果通訊對端同樣支援SMC-R協議並協商成功,則兩端將基於RDMA網路完成資料轉送,否則將安全回退使用TCP網路傳輸。
執行以下命令,關閉net namespace範圍全域替換開關net.smc.tcp2smc。
sysctl net.smc.tcp2smc=0
進程維度透明替換
Alibaba Cloud Linux 3還提供了進程維度協議透明替換功能,該功能實現需要基於SMC-R的監控診斷工具smc-tools。smc-tools的安裝操作,請參見安裝smc-tools工具。
替換過程如下圖所示:
使用smc-tools工具集中的指令碼
smc_run
運行應用程式時,smc_run
通過環境變數LD_PRELOAD
將smc-tools工具集中的libsmc-preload.so定義為優先載入的動態庫。libsmc-preload.so將把應用程式及其子進程中符合如下條件的TCP socket替換為SMC socket。
family為AF_INET
type為SOCK_STREAM
protocol為IPPROTO_IP或IPPROTO_TCP
執行以下命令,指定TCP socket程式foo運行在SMC-R協議棧。
smc_run ./foo
此時foo應用程式建立的TCP socket將被透明替換為SMC socket。通過SMC-R協議棧處理應用程式網路行為。如技術架構:自動協商和安全回退中所述,如果通訊對端同樣支援SMC-R協議並協商成功,則兩端將基於RDMA網路完成資料轉送,否則將安全回退使用TCP網路傳輸。
監控診斷
在使用SMC過程中,您可以使用smc-tools工具監控和診斷SMC核心協議棧,瞭解和掌握SMC網路流量的各類指標,判斷網路健康情況。更多資訊,請參見共用記憶體通訊(SMC)監控和診斷。
常見問題
如果您在使用SMC過程中無法正常通訊、遇到部分連接埠不可用等問題,您可以參考共用記憶體通訊(SMC)常見問題進行解決。