全部產品
Search
文件中心

Alibaba Cloud Linux:共用記憶體通訊(SMC)使用說明

更新時間:Apr 09, 2025

本文將介紹如何啟用SMC(Shared Memory Communication),如何設定SMC加速範圍以及如何配置SMC暴露出的各種介面以獲得最佳的加速效果。

在阿里雲ECS上使用SMC

Alibaba Cloud Linux 3提供並最佳化了SMC-R核心協議棧,您可以通過以下步驟使用SMC-R。

前期準備

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

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

    重要
    • 阿里雲eRDMA裝置與SMC目前均不支援使用IPv6地址。如果應用程式層使用IPv6地址,會導致SMC回退到TCP協議棧。更多資訊,請參見啟用SMC後使用IPv6地址出現回退

    • ANCK 5.10.134-17.3版本開始,SMC支援使用IPv4-mapped IPv6地址。

  2. 載入smcsmc_diag核心模組。

    sudo modprobe smc
    sudo 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後可通過下述方式卸載SMC模組。

    sudo rmmod smc_diag
    sudo rmmod smc
  3. 執行以下命令,安裝smc-toolsaliyun-smc-extensions營運工具。

    sudo yum install -y smc-tools
    sudo yum install -y aliyun-smc-extensions

將應用程式的TCP socket運行於SMC協議棧

Alibaba Cloud Linux 3 SMC-R支援兩個維度socket協議透明轉換。

net namespace維度socket協議轉換

Alibaba Cloud Linux 3提供了net namespace維度socket協議透明轉換功能,可以通過sysctl net.smc.tcp2smc開關將net namespace中所有符合如下條件的TCP socket轉換為SMC socket。

  • family為AF_INET

  • type為SOCK_STREAM

  • protocol為IPPROTO_IP(0)或IPPROTO_TCP(6)

替換過程如下圖所示。

net namespace維度開啟透明轉換的操作步驟如下。

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

    此後新建立的TCP socket將被轉變為SMC socket,而存量的TCP socket不受影響。

    sudo sysctl net.smc.tcp2smc=1

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

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

    樣本中的foo需替換為具體程式名。

    ./<foo>

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

  3. (可選)執行以下命令,關閉net namespace範圍全域替換開關。此後新建立的TCP socket不再被轉換,而存量已被轉換的SMC socket不受影響。

    sudo sysctl net.smc.tcp2smc=0

進程維度socket協議轉換

Alibaba Cloud Linux 3還提供了進程維度協議透明轉換功能,該功能的使用基於SMC營運工具smc-tools

使用smc-tools工具中的指令碼smc_run運行應用程式,smc_run通過環境變數LD_PRELOADsmc-tools工具集中的libsmc-preload.so定義為優先載入的動態庫。libsmc-preload.so將把應用程式及其子進程中符合如下條件的TCP socket轉換為SMC socket。

  • family為AF_INET

  • type為SOCK_STREAM

  • protocol為IPPROTO_IP(0)或IPPROTO_TCP(6)

說明

smc_run使用LD_PRELOAD來攔截glibc中的socket()系統調用,因此對不使用glibc或是靜態連結的應用無效。

替換過程如下圖所示。

在進程維度開啟透明轉換的操作步驟如下。

執行以下命令,在應用程式foo執行命令前增加smc_run首碼。

樣本中foo需替換為具體進程名。

smc_run ./<foo>

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

基於BPF策略的SMC協商控制

在實際使用中,net namespace或進程維度SMC使能有時粒度仍然過粗。例如,服務端在net namespace中有多個網路監聽連接埠,希望僅針對有效能加速訴求的連接埠上的串連使用SMC,對其餘如管控連接埠上的串連安全回退到使用TCP通訊。

為此,Alibaba Cloud Linux 3在上述維度開啟SMC透明轉換的基礎上,支援進一步使用BPF技術控制串連是否使用SMC協商。典型流程為:

  1. 使能和配置BPF策略,設定細粒度的SMC協商控制。

  2. 開啟net namespace或進程維度SMC使能。具體操作,可參見將應用程式的TCP socket運行於SMC協議棧

原理概述中所述,通訊雙方在TCP串連握手過程中使用特殊的TCP選項標明自身支援SMC-R,並確認對端是否同樣支援SMC-R。一旦協商成功,後續通訊雙方的網路傳輸將基於RDMA網路完成,否則將安全回退到使用TCP網路傳輸。

預設情況下,SMC socket總是會發起和響應這個特殊的TCP選項。但是可以通過BPF技術進一步基於連接埠或IPv4地址的策略來控制是否發起或響應這個特殊的TCP選項,從而實現更細粒度的SMC使能控制。

為此,Alibaba Cloud Linux 3在smc-tools中提供smc-ebpf工具來實現BPF策略的使能和配置。

執行下列命令,查看smc-ebpf是否安裝成功。

smc-ebpf policy help

結果如下所示,說明smc-ebpf安裝成功。

smc-ebpf policy help
 Usage: smc-ebpf policy COMMAND [OPTIONS]
        smc-ebpf policy load [OPTIONS]    load policy
    --init                                load policy with pre-defination config
        smc-ebpf policy stop              stop policy
        smc-ebpf policy unload            unload policy
        smc-ebpf policy init              init policy with default config
        smc-ebpf policy clear             clear all policy config
        smc-ebpf policy dump              display all policy config
        smc-ebpf policy config [OPTIONS]  config policy
        smc-ebpf policy delete [OPTIONS]  delete policy
    --ip [IPv4]                           target IPv4 address
    --port                                target port
    --mode [auto|disable|enable]          target mode
 Examples:
    smc-ebpf policy load
    #disable port 80 to use smc
    smc-ebpf policy config --port 80 --mode disable
    #delete ip xxx.xxx.x.x/24 policy
    smc-ebpf policy delete --ip xxx.xxx.x.x --mask 24

載入smc-ebpf

執行下列命令,載入smc-ebpf

sudo smc-ebpf policy load
警告
  • smc-ebpf需要在待配置的串連建立前完成載入,即smc-ebpf對在其載入前建立的串連無效。

  • smc-ebpf配置的策略是系統全域的,無法針對特定的netns(容器)進行獨立配置。

  • smc-ebpf相關功能仍在持續推進上遊社區標準化中,未來存在介面的變動的可能,目前僅作為實驗性功能。

  • 結果如下所示,表示載入成功。

    # sudo smc-ebpf policy load
    Registered smc_sock_negotiator_ops anolis_smc id xxx
  • 否則,在當前環境中無法使用這項功能。原因排查方向包括:

    • 確認作業系統核心版本在ANCK 5.10.134-016及以上。您可以通過uname -r命令查看核心版本。

    • 確認您有許可權載入BPF程式,一個常見的原因可能是您使用的POD容器沒有載入BPF程式的能力或者您的使用者特權等級不足,您可以向您環境的供應商諮詢更多資訊。

連接埠策略預設行為

smc-ebpf載入後,若沒有任何連接埠策略匹配目標連接埠時,預設禁止目標連接埠使用SMC協商。

例如:

  • smc-ebpf載入後未配置任何連接埠策略,那麼所有連接埠都被禁止使用SMC協商;

  • smc-ebpf載入後僅配置一條允許80連接埠使用SMC協商的策略。那麼使用8080連接埠時,由於沒有任何策略匹配到8080連接埠,則禁止8080連接埠使用SMC協商;

特別地,您可以通過執行以下命令,將連接埠0配置為enable來修改預設行為到:在沒有任何連接埠策略匹配目標連接埠時,允許目標連接埠使用SMC協商。

sudo smc-ebpf policy config --port 0 --mode enable

同樣地,您可以通過執行以下命令,將連接埠0配置為disable來再次改變預設行為到:在沒有任何連接埠策略匹配目標連接埠時,禁止目標連接埠使用SMC協商。

sudo smc-ebpf policy config --port 0 --mode disable

配置基於連接埠的策略

在預設行為的基礎上,可添加針對特定連接埠的策略。

例如:

  • 樣本一:只允許80連接埠使用SMC協商,其他連接埠均禁止使用SMC協商。

    執行以下命令,添加允許80連接埠使用SMC協商的策略。

    sudo smc-ebpf policy config --port 80 --mode enable

    執行以下命令,查看連接埠策略配置結果。

    sudo smc-ebpf policy dump

    輸出結果樣本:

    • "key": 80代表策略針對連接埠80。

    • "mode": 代表禁止或允許使用SMC協商,2代表允許,0代表禁止。

    # sudo smc-ebpf policy dump
    [{
            "key": 80,
            "value": {
                "mode": 2,
                [其餘欄位普通使用者無需關注]
            }
        }
    ]

    若不再需要此策略,執行以下命令,刪除上述針對80連接埠的策略。

    sudo smc-ebpf policy delete --port 80

    再次執行dump命令,結果如下所示,說明配置被成功刪除。

    # sudo smc-ebpf policy dump
    []
  • 樣本二:只禁止80連接埠使用SMC協商,其他連接埠均允許使用SMC協商。

    執行以下命令,修改預設行為到:在沒有任何連接埠策略匹配目標連接埠時,允許目標連接埠使用SMC協商。並添加禁止80連接埠使用SMC協商的策略。

    sudo smc-ebpf policy config --port 0 --mode enable
    sudo smc-ebpf policy config --port 80 --mode disable

    此後只有80連接埠被禁止使用SMC協商,其他沒有匹配策略的連接埠則被允許使用SMC協商。

IPv4地址策略預設行為

與連接埠策略不同的是,IPv4地址策略僅對Client socket有效,用於在Client socket串連Server時根據Server IPv4地址控制Client是否使用SMC協商。

說明

所有配置的連接埠和IPv4地址策略共同組成“與”邏輯,即串連匹配的所有策略均允許使用SMC協商時才會使用SMC協商,任意匹配條件禁止使用SMC協商時均不會使用SMC協商。

smc-ebpf載入後,若沒有任何IPv4地址策略匹配目標Server IP時,預設允許對目標Server IP使用SMC協商。

例如:

  • smc-ebpf載入後未配置任何IPv4地址策略,那麼Client socket串連所有Server IP時都被允許使用SMC協商;

  • smc-ebpf載入後僅配置一條禁止在訪問192.168.1.0/24時使用SMC協商的策略。那麼在訪問192.168.3.11時,由於沒有任何策略匹配到192.168.3.11,則允許在訪問192.168.3.11時使用SMC協商;

特別地,您可以通過執行以下命令,將0.0.0.0/32配置為disable來修改預設行為到:在沒有任何IPv4地址策略匹配目標Server IP時,禁止對目標Server IP使用SMC協商。

sudo smc-ebpf policy config --ip 0.0.0.0 --mask 32 --mode disable

同樣地,您可以通過執行以下命令,將0.0.0.0/32配置為enable來恢複預設行為到:在沒有任何IPv4地址策略匹配目標Server IP時,允許對目標Server IP使用SMC協商。

sudo smc-ebpf policy config --ip 0.0.0.0 --mask 32 --mode enable

配置基於IPv4地址的策略

在預設行為的基礎上,可配置針對IPv4地址的策略,用於在Client socket串連特定Server IP時控制Client是否使用SMC協商。

說明

設定的IPv4地址過濾規則只針對Client socket串連Server IPv4地址時控制Client是否使用SMC協商。Server socket是否使用SMC協商不受IPv4地址過濾規則的影響。

例如:

  • 樣本一:只允許Client在串連192.168.2.0/24時使用SMC協商,訪問其他服務端時均禁止使用SMC協商。

    執行以下指令,將0.0.0.0/32配置為disable來修改預設行為到:在沒有任何IPv4地址策略匹配目標Server IP時,禁止對目標Server IP使用SMC協商。並添加允許對192.168.2.0/24服務端地址使用SMC協商的策略。

    sudo smc-ebpf policy config --ip 0.0.0.0 --mask 32 --mode disable
    sudo smc-ebpf policy config --ip 192.168.2.0 --mask 24 --mode enable

    執行以下指令,查看IPv4原則設定結果。

    sudo smc-ebpf policy dump

    輸出結果樣本:

    • key:代表策略針對的IPv4地址;

    • value:代表禁止或允許使用SMC協商,pass代表允許,denied代表禁止。

    # sudo smc-ebpf policy dump
    key:     0.0.0.0/32           value:   "denied"
    key:     192.168.2.0/24       value:   "pass"

    若不再需要上述IPv4地址策略,執行以下命令,刪除針對0.0.0.0/32192.168.2.0/24的策略。

    sudo smc-ebpf policy delete --ip 192.168.2.0 --mask 24
    sudo smc-ebpf policy delete --ip 0.0.0.0 --mask 32
  • 樣本二:只禁止Client在串連192.168.2.0/24時使用SMC協商,訪問其他服務端時均允許使用SMC協商。

    執行以下指令,添加禁止對192.168.2.0/24服務端地址使用SMC協商的策略。

    sudo smc-ebpf policy config --ip 192.168.2.0 --mask 24 --mode disable

    無需其他動作,因為smc-ebpf載入後,若沒有任何IPv4地址策略匹配目標Server IP時,預設允許對目標Server IP使用SMC協商。所以除192.168.2.0/24以外的服務端地址均允許使用SMC協商。

清除策略

執行以下命令,清除所有配置的策略。

sudo smc-ebpf policy clear

執行後所有配置將會被刪除,此時預設行為將恢複到:禁止協商SMC,即針對所有連接埠均禁止使用SMC協商,針對所有IPv4地址均允許使用SMC協商,兩類策略共同組成“與”邏輯,最終禁止所有串連使用SMC協商。

在阿里雲ACK上使用SMC

在阿里雲Container ServiceACK中,可以通過ACK eRDMA Controller組件啟用SMC。eRDMA Controller提供了eRDMA網卡的管理、調度以及Pod的網路能力。具體操作,請參見使用SMC-R透明加速應用網路

說明

在阿里雲ECS上使用SMC類似,在阿里雲ACK上使用SMC同樣可以在Node上配置基於BPF的SMC細粒度使能策略。

參數配置說明

SMC協議棧通過sysfs及使用者態工具smc-tools等方式提供多種配置介面,以下將介紹SMC的可配置功能。

通過sysfs配置參數

核心參數

參數說明

核心版本限制

配置建議

net.smc.autocorking_size

SMC-R提供autocork特性,功能上與TCP autocork類似,將多個小資料包彙總成更大的資料包一次性發送,在不影響乒乓時延效能的前提下,提高小包情境下的吞吐效能。

autocorking_size用於配置彙總資料包的上限大小。

預設值:65535。

有效值:0~4294967295,0表示關閉。

核心5.10.112-11及以上版本。

在小包且注重頻寬的情境中,可調整此參數至合適的數值,以實現最佳的頻寬效果。

pipeline收發且注重時延情境中,可以將此配置設定為0,以避免autocork對流水線處理造成滯後。

net.smc.autosplit_size

SMC提供autosplit特性,將一個巨量資料包拆分成多個小資料包分批發送,以提高大包情境下的時延效能。當資料包大小超過autosplit_size的1.3倍時,將被拆分。

預設值:131072。

有效值:32768~536870912。

核心:

  • 5.10.134-18及以上版本。

  • 5.10.134-17.3及以上的17系列版本。

  • 5.10.134-16.5及以上的16系列版本。

在大包且注重時延的情境中,可以適當調整此參數,以達到最佳的時延效果。

net.smc.experiment_vendor_options

阿里雲實驗特性選項。

預設值:4294967295(0xFFFFFFFF)。

核心5.10.134-16及以上版本。

不建議修改。

net.smc.global_mem

SMC整機記憶體水位控制,當SMC協議棧所維持的收發緩衝區大小大於等於global_mem[2]後,所有建立的SMC串連都將回退到TCP。

預設值:[25%整機記憶體,50%整機記憶體,75%整機記憶體]。

核心:

  • 5.10.134-18及以上版本。

  • 5.10.134-17.3及以上的17系列版本。

  • 5.10.134-16.5及以上的16系列版本。

可根據期望的記憶體水位配置global_mem[2]

net.smc.limit_smc_hs

控制是否在建連壓力大時主動回退到TCP。

預設值:1。

有效值:

  • 0:關閉

  • 1:開啟

核心:

  • 5.10.134-18及以上版本。

  • 5.10.134-17.3及以上的17系列版本。

  • 5.10.134-16.5及以上的16系列版本。

建議設定為1,開啟。

在特定情況下,如不希望SMC協議棧根據串連壓力自動回退,可將其設定為0。

net.smc.mem

SMC在當前net namespace記憶體水位控制,當net namespace中所有SMC串連所使用的收發緩衝區大小大於等於mem[2]後,所有此net namespace內建立的SMC串連都將回退到TCP。

預設值:[25%整機記憶體,50%整機記憶體,75%整機記憶體]。

核心:

  • 5.10.134-18及以上版本。

  • 5.10.134-17.3及以上的17系列版本。

  • 5.10.134-16.5及以上的16系列版本。

可根據期望的記憶體水位配置mem[2]

net.smc.rmem

SMC socket預設接收緩衝區大小。沒有使用setsockopt()主動設定接收緩衝區(SO_RCVBUF)大小時,將使用此值。

預設值:262144。

有效值:

  • SMC-R:16384(16K)~536870912(512M)

  • SMC-D:16384(16K)~1048576(1M)

核心5.10.134-14及以上版本。

  • 當本側監控指標Rx/Buffer full佔比較高時,應適當增大本地接收緩衝區大小。

  • 當本側監控指標Tx/Buffer full(remote)Tx/Buffer too small(remote)的佔比較高時,應適當增加對端接收緩衝區的大小。

  • 當記憶體資源緊張,且減少緩衝區大小不會影響網路效能時可適當減少緩衝區大小。

具體內容,請參見協議棧監控

net.smc.wmem

SMC socket預設發送緩衝區大小。沒有使用setsockopt()主動設定發送緩衝區(SO_SNDBUF)大小時,將使用此值。

預設值:262144。

有效值:

  • SMC-R:16384(16K)~536870912(512M)

  • SMC-D:16384(16K)~1048576(1M)

核心5.10.134-14及以上版本。

  • 當本側監控指標Tx/Buffer fullTx/Buffer too small佔比較高時,應適當增加本地發送緩衝區大小。

  • 當記憶體資源緊張,且減少緩衝區大小不會影響網路效能時可適當減少緩衝區大小。

具體內容,請參見協議棧監控

net.smc.smcr_buf_type

SMC-R的收發緩衝區記憶體類型。使用物理連續記憶體能夠擁有更優效能,但是通常物理連續記憶體難以獲得,可能會導致緩衝區降級到比預期小。相反,虛擬連續記憶體較易擷取,但效能會稍遜。

修改此值後,將在新建立的LGR所承載的SMC串連上生效,已有的LGR不受影響。

預設值:2。

有效值:

  • 0:物理連續記憶體。

  • 1:虛擬連續記憶體。

  • 2:優先使用物理連續記憶體,無法擷取時使用虛擬連續記憶體。

核心5.10.134-12及以上版本。

不建議修改。

net.smc.smcr_max_conns_per_lgr

SMC-R中一個LGR能夠承載的SMC串連數量上限。

預設值:32。

有效值:

  • 1~255(5.10.134-18及以上版本,5.10.134-17.3及以上的17系列版本,5.10.134-16.5及以上的16系列版本)。

  • 16~255(其他版本)。

核心5.10.134-16.1及以上版本。

謹慎修改。

  • 對於大吞吐情境,可以適當減少每個LGR所承載的SMC串連數量,以確保各個SMC串連能夠獲得更多的RDMA頻寬。

  • 不建議增大該值。

net.smc.smcr_max_links_per_lgr

SMC-R中一個LGR包含的RDMA RC串連(SMC Link)數量。

預設值:1。

有效值:1~2。

核心5.10.134-16.1及以上版本。

不建議修改。

net.smc.smcr_testlink_time

SMC-R中RDMA RC串連(SMC Link)的心跳包間隔時間(單位:秒)。當SMC Link上沒有資料轉送時,每隔smcr_testlink_time秒傳輸16位元組資料確認鏈路可用。

預設值:30。

有效值:0~2147483647,0代表關閉心跳檢查。

核心5.10.134-13及以上版本。

不建議修改。

net.smc.tcp2smc

當前net namespace範圍內TCP到SMC透明轉換的開關。開啟後此net namespace下新建立的TCP socket將在核心中被劫持,替換familyprotocol參數後成為SMC socket,運行於SMC協議棧。

預設值:0。

有效值:

  • 0:關閉net namespace SMC替換。

  • 1:開啟net namespace SMC替換。

核心5.10.134-16及以後版本。

  • 設定為1開啟net namespace維度TCP到SMC透明替換。

  • 設定為0關閉net namespace維度TCP到SMC透明替換。

配置EID參數

EID(Enterprise ID)是SMCv2協議中引入的概念,只有配置了相同EID的兩個系統才能通過SMCv2通訊,否則將回退到使用TCP通訊。一個系統最多可以配置8個EID。

在Alibaba Cloud Linux 3上eRDMA裝置只允許配合SMCv2協議使用。Alibaba Cloud Linux 3系統初始配置了SMCV2-DEFAULT-UEID這一EID,因此初始狀態下所有Alibaba Cloud Linux 3節點間均可以使用SMCv2配合eRDMA通訊,無需額外手動設定。

若在特殊情況下需要通過修改EID控制通訊範圍,配置方式如下。

  1. 查看已有EID。

    smcr ueid show
  2. 添加新的EID。

    EID最多可包含32個字元,允許使用大寫字母(A-Z)、數字(0-9)、連字號(-)以及點(.)。第一個字元必須為字母或數字,且點(.)不可連續使用。

    sudo smcr ueid add <EID>
  3. 刪除已有EID。

    sudo smcr ueid del <EID>

案例:使用EID避免跨可用性區域的SMC-R通訊

為了更好地發揮SMC-R的加速效果,推薦在同可用性區域內使用SMC-R加速,跨可用性區域仍使用TCP通訊。通過將可用性區域ID添加為EID,實現在同可用性區域內使用SMC-R加速,跨可用性區域時自動回退到TCP通訊。具體配置步驟如下。

  • 方式一:分步配置EID

    1. 執行以下命令,通過阿里雲ECS執行個體中繼資料擷取可用性區域ID。詳細內容,請參考執行個體中繼資料

      ZONE_ID=$(curl -s -m 1 100.100.100.200/latest/meta-data/zone-id | tr "[:lower:]" "[:upper:]")
    2. 執行以下命令,將可用性區域ID添加為EID。

      sudo smcr ueid add $ZONE_ID
    3. 執行以下命令,刪除預設的SMCV2-DEFAULT-UEID

      smcr ueid | grep SMCV2-DEFAULT-UEID > /dev/null && sudo smcr ueid del SMCV2-DEFAULT-UEID
  • 方式二:使用aliyun-smc-extensions工具的aliyunsmc-ueid服務一鍵配置EID

    1. 執行以下命令,啟動aliyunsmc-ueid服務,此服務會自動將可用性區域ID添加為EID,同時刪除預設EID。

      sudo systemctl start aliyunsmc-ueid
    2. (可選)執行以下命令,配置開機自啟動aliyunsmc-ueid服務。這是由於EID配置不具備持久化的功能,在OS重啟時會恢複到預設狀態。

      sudo systemctl enable aliyunsmc-ueid

配置PNET ID參數

在TCP通訊中,網路流量通過乙太網路介面(ENI)進出。當透明轉換TCP通訊到SMC-R通訊時,SMC-R協議棧將使用與此乙太網路介面相關聯的RDMA網路介面(ERI)。

這種關聯關係有以下兩種形式。

  • 目標ENI上直接開啟eRDMA能力得到的ERI,SMC-R協議棧將自動關聯此ENI與ERI。

    這種情況下SMC-R協議棧能夠自動識別並使用ENI關聯的ERI,無需額外操作。

  • 其他ENI上開啟eRDMA能力得到的ERI,需要使用PNET ID將ERI與目標ENI關聯。

    以如下情況為例:

    節點中存在乙太網路介面eth0eth1,其中僅eth0開啟RDMA介面erdma_0

    此時若TCP流量從eth0收發,切換為SMC-R後能夠自動尋找到關聯的erdma_0,使用RDMA網路通訊。即上述第一種自動關聯的情況。

    若TCP流量從eth1收發,切換為SMC-R後則無法自動尋找到erdma_0介面,進而回退到TCP。此時可以使用同一PNET ID關聯eth1erdma_0,以告知SMC-R可以使用erdma_0介面承載eth1的流量。

    使用PNET ID關聯ENI和ERI步驟如下:

    • 執行以下命令,將目標ENI和ERI配置上相同的PNET ID:

      • 為乙太網路介面ENI配置PNET ID。

        sudo smc_pnet -a <PNET ID> -I <eth_interface>
      • 為eRDMA介面ERI配置PNET ID。

        sudo smc_pnet -a <PNET ID> -D <rdma_interface>

      PNET ID的合法格式為最多 16 個大寫字母數字字元(不含空格)。

    • 執行以下命令,檢查配置的PNET ID參數。

      # sudo smc_pnet

      輸出結果樣本:

      # sudo smc_pnet
      00163E0CD751 n/a erdma_0 1
      00163E0CD751 eth1 n/a 255

      樣本中erdma_0綁定了PNET ID:00163E0CD751,eth1也綁定了PNET ID:00163E0CD751。這樣一來,原本通過eth1介面收發資料的TCP通訊在啟用SMC-R後就可以通過erdma_0介面收發資料。

案例:使用PNET ID關聯POD乙太網路介面和宿主機eRDMA介面

在共用宿主機ERI的自建容器情境中,多個POD共用宿主機上的一個或多個eRDMA網卡。通過為POD乙太網路介面veth和宿主機eRDMA介面設定相同的PNET ID,可使容器內開啟SMC-R後,核心協議棧能夠正確地尋找到宿主機上的eRDMA網路介面,進而使用RDMA網路加速容器veth介面上的網路流量。

具體配置步驟如下。

  1. 在容器net namespace下為容器乙太網路介面(以eth0為例)配置PNET ID。

    sudo ip netns exec <pod netns> smc_pnet -a <PNET ID> -I eth0
  2. 在宿主機net namespace下為eRDMA介面(以erdma_0為例)配置PNET ID。

    sudo smc_pnet -a <PNET ID> -D erdma_0

實踐案例:在ECS Redis情境使用SMC

  1. 建立兩台ECS執行個體,一台執行個體作為Redis用戶端,另一台執行個體作為Redis服務端。具體參數說明,請參見自訂購買執行個體

  2. 載入smcsmc_diag核心模組。

    sudo modprobe smc
    sudo modprobe smc_diag
  3. 執行以下命令,分別為兩台執行個體安裝Redis。

    sudo yum install redis -y
  4. 分別在兩台執行個體上執行以下命令,使用EID避免跨可用性區域SMC-R通訊。

    sudo systemctl start aliyunsmc-ueid
  5. 分別在兩台執行個體上執行以下命令,配置基於連接埠的BPF策略。只允許Server IP地址在vswitch網段內且服務連接埠為6379的串連使用SMC協商。

    1. 執行以下命令,載入smc-ebpf

      sudo smc-ebpf policy load
    2. 配置針對連接埠的策略,只允許對6379連接埠使用SMC協商。

      sudo smc-ebpf policy config --port 6379 --mode enable
    3. 配置針對IPv4地址的策略,只允許對在vswitch網段內的Server IP使用SMC協商。

      sudo smc-ebpf policy config --ip 0.0.0.0 --mask 32 --mode disable
      cidr=$(curl -s -m 1 100.100.100.200/latest/meta-data/vswitch-cidr-block)
      sudo smc-ebpf policy config --ip \
        $(echo ${cidr} | awk -F'/' '{print $1}') --mask \
        $(echo ${cidr} | awk -F'/' '{print $2}') --enable;
  6. 分別在兩台執行個體上執行以下命令,配置net namespace維度協議透明轉換。

    sudo sysctl -w net.smc.tcp2smc=1
  7. 在Redis服務端執行個體上執行以下命令,啟動Redis服務。

    IP需替換為服務端執行個體主網卡的私人IP地址。

    redis-server --bind <IP> --port 6379 --protected-mode no --save
  8. 在Redis用戶端執行個體上串連或測試Redis服務端。

    • 執行以下命令,串連Redis服務端。

      redis-cli -h <IP> -p 6379
    • 執行以下命令,使用redis-benchmark進行壓測。

      redis-benchmark -h <IP> -p 6379 -n 1000000 -t set -c 100