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