全部產品
Search
文件中心

Elastic Compute Service:基於eRDMA部署高網路效能的bRPC應用

更新時間:Nov 19, 2024

基於支援eRDMA能力的ECS執行個體部署bRPC應用,可以充分利用eRDMA提供的低延遲、高輸送量以及低CPU佔用等特性,以最佳化bRPC應用的資料轉送效率,適用於對訊息輸送量和時延要求較高的應用情境。本文介紹如何基於支援eRDMA能力的ECS執行個體部署bRPC應用,並測試eRDMA對bRPC應用的效能提升效果。

說明
  • bRPC是用C++語言編寫的一種高效能、通用的遠端程序呼叫RPC(Remote Procedure Call)架構,提供了豐富的特性和工具集來簡化服務的開發和部署,常用於搜尋、儲存、機器學習、廣告等情境,適合構建高並發、低延遲的微服務和大型分布式系統。更多資訊,請參見bRPC構建說明

  • eRDMA(Elastic Remote Direct Memory Access,彈性RDMA),是阿里雲提供的低延遲、大吞吐、高彈性的高效能RDMA網路服務。更多資訊,請參見eRDMA概述

步驟一:準備環境

本步驟需要建立2台支援eRDMA能力的ECS執行個體,1台作為server端,1台作為client端。建立過程中需注意以下配置項:

  • 執行個體規格:選用的執行個體規格需支援eRDMA能力。更多資訊,請參見使用限制。本文樣本規格:ecs.g8a.8xlarge。

  • 鏡像:選用的鏡像需支援eRDMA能力。更多資訊,請參見使用限制。本文樣本鏡像:Alibaba Cloud Linux 3.2104 LTS 64位。

  • 安裝eRDMA驅動:勾選安裝eRDMA驅動。執行個體啟動過程中會自動安裝eRDMA驅動,無需您再手動安裝。

    說明

    在執行個體啟動後,請您間隔3~5分鐘等待eRDMA驅動安裝完成後再執行後續操作。更多資訊,請參見在企業級執行個體上使用eRDMA

  • 網路:

    • 均需開通公網。

    • 在同一個Virtual Private Cloud,預設內網互連。

    • 彈性網卡:在網卡右側選中彈性RDMA介面

其他更多的參數說明,請參見自訂購買執行個體

步驟二:部署並編譯bRPC

分別在2台ECS執行個體(server端和client端)上部署並編譯bRPC。本樣本以Alibaba Cloud Linux 3作業系統為例,其他動作系統部署bRPC的方法,請參見bRPC編譯

  1. 依次登入2台ECS執行個體。

    具體操作,請參見以SSH的方式登入Linux執行個體(支援私網)

  2. 運行以下命令,修改eRDMA與bRPC的建鏈模式以實現相容。

    說明

    eRDMA預設使用RDMA_CM模式建鏈,bRPC預設使用OOB(Out-of-Band)模式建鏈,因此需要修改eRDMA與bRPC的建鏈模式以實現相容。

    sudo sh -c "echo 'options erdma compat_mode=Y' >> /etc/modprobe.d/erdma.conf"
    sudo dracut --force
    sudo rmmod erdma
    sudo modprobe erdma compat_mode=Y
  3. 解除記憶體鎖定的限制。對於使用eRDMA技術的應用需要較大記憶體,通常需要解除記憶體鎖定的限制,以提高資料轉送效率。

    1. 運行以下命令,編輯limits.conf檔案。

      sudo vi /etc/security/limits.conf
    2. 在檔案末尾添加以下內容並儲存檔案。

      * soft memlock unlimited
      * hard memlock unlimited
  4. 運行以下命令,部署bRPC應用。

    sudo yum install git gcc-c++ make openssl-devel gflags-devel protobuf-devel protobuf-compiler leveldb-devel -y
    git clone https://github.com/apache/brpc.git
  5. 在使用eRDMA測試bRPC時,建議在server端和client端分別安裝以下補丁,以獲得更好的效能。

    1. 根據實際環境在brpc目錄下建立檔案,例如檔案名稱為erdma-multi-sge.patch。樣本命令如下:

      cd ~/brpc
      sudo vi erdma-multi-sge.patch
    2. 增加以下內容並儲存檔案。

      diff --git a/src/brpc/rdma/rdma_helper.cpp b/src/brpc/rdma/rdma_helper.cpp
      index cf1cce95..d2592cbb 100644
      --- a/src/brpc/rdma/rdma_helper.cpp
      +++ b/src/brpc/rdma/rdma_helper.cpp
      @@ -619,7 +619,7 @@ void DeregisterMemoryForRdma(void* buf) {
       }
      
       int GetRdmaMaxSge() {
      -    return g_max_sge;
      +    return 4;
       }
      
       int GetRdmaCompVector() {
      --
      2.39.3
    3. 運行以下命令,將補丁檔案應用到bRPC的原始碼中。

      patch -p1 < erdma-multi-sge.patch
    4. 運行以下命令,編譯bRPC的原始碼。

      sh config_brpc.sh --with-rdma --headers="/usr/include" --libs="/usr/lib64 /usr/bin"
      make -j
      cd example/rdma_performance; make -j

步驟三:效能測試

分別在使用eRDMA功能和不使用eRDMA功能的情境中測試bRPC的效能,根據測試結果比較eRDMA對bRPC帶來的效能提升。

  1. 在以下兩種情境中分別測試bRPC的效能。

    使用eRDMA功能

    1. 在server端運行以下命令,啟動server端並通過eRDMA進行通訊。

      ./server --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=true
    2. 在client端運行以下命令,串連到server端並通過eRDMA進行通訊。

      ./client --servers=<server端私網IP地址>:8002 --rpc_timeout_ms=-1 --attachment_size=1024 --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=true --queue_depth=16

      其中:

      • <server端私網IP地址>需根據實際環境替換。

      • --attachment_size用於指定每次bRPC調用或資料轉送時附帶資料的大小,該參數影響資料轉送的效率,大塊資料轉送可以更高效地利用eRDMA的優勢,但如果資料過大,也可能導致記憶體管理複雜度增加,請您根據實際測試需求合理設定。

      • --queue_depth:用於設定請求隊列的深度,即隊列中可以同時存在的請求數量。較高的隊列深度有助於應對高並發情境下的請求洪峰,避免因隊列滿而導致的請求拒絕,但過大的隊列深度可能會佔用更多記憶體資源,請您根據實際測試需求合理設定。

    不使用eRDMA功能

    1. 在server端運行以下命令,啟動server端並通過TCP進行通訊。

      ./server --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=false
    2. 在client端運行以下命令,串連到server端並通過TCP進行通訊。

      ./client --servers=<server端私網IP地址>:8002 --rpc_timeout_ms=-1 --attachment_size=1024 --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=false --queue_depth=16

      其中:

      • <server端私網IP地址>需根據實際環境替換。

      • --attachment_size用於指定每次bRPC調用或資料轉送時附帶資料的大小,該參數影響資料轉送的效率,大塊資料轉送可以更高效地利用eRDMA的優勢,但如果資料過大,也可能導致記憶體管理複雜度增加,請您根據實際測試需求合理設定。

      • --queue_depth:用於設定請求隊列的深度,即隊列中可以同時存在的請求數量。較高的隊列深度有助於應對高並發情境下的請求洪峰,避免因隊列滿而導致的請求拒絕,但過大的隊列深度可能會佔用更多記憶體資源,請您根據實際測試需求合理設定。

  2. 擷取兩種測試結果,比較eRDMA對bRPC在時延(查看Avg-Latency欄位)和頻寬(查看QPS欄位)等方面帶來的效能提升。