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