全部產品
Search
文件中心

Elastic Compute Service:共用記憶體通訊(SMC)使用說明

更新時間:Jul 04, 2024

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:

  1. 建立支援ERI的ECS執行個體。

    SMC-R基於RDMA實現,因此使用SMC-R前需要建立支援ERI功能的ECS執行個體,以獲得雲上RDMA能力。具體操作,請參見在企業級執行個體上配置eRDMA

    重要

    阿里雲ERI eRDMA裝置與SMC目前均不支援使用IPv6地址。如果應用程式層使用IPv6地址,會導致SMC回退到TCP協議棧。

  2. 執行以下命令,載入smcsmc_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
  3. 執行以下命令,安裝SMC的營運工具集smc-tools。

    yum install -y smc-tools
  4. (可選)設定收發緩衝區預設大小。

    技術架構:基於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.wmemsysctl net.smc.rmem的初始化值為 256 KB。

    除了上述設定SMC-R socket的sndbuf和RMB預設值的方法,應用程式還可以通過setsockopt()系統調用,在建立串連前設定SMC-R socket的SO_SNDBUF和SO_RCVBUF選項值,進而改變SMC-R socket所使用的sndbuf和RMB大小。

  5. 基於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維度開啟透明替換的操作步驟如下:

      1. 執行以下命令,開啟net namespace範圍全域替換開關net.smc.tcp2smc。

        sysctl net.smc.tcp2smc=1

        預設情況下,sysctl net.smc.tcp2smc=0,處在關閉狀態。

      2. 執行以下命令,在此net namespace中運行TCP socket應用程式。

        ./foo

        此時foo應用程式建立的TCP socket將被透明替換為SMC socket。通過SMC-R協議棧處理應用程式網路行為。如技術架構:自動協商和安全回退中所述,如果通訊對端同樣支援SMC-R協議並協商成功,則兩端將基於RDMA網路完成資料轉送,否則將安全回退使用TCP網路傳輸。

      3. 執行以下命令,關閉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)常見問題進行解決。