基於支援eRDMA能力的ECS執行個體部署bRPC應用,可以充分利用eRDMA提供的低延遲、高輸送量以及低CPU佔用等特性,以最佳化bRPC應用的資料轉送效率,適用於對訊息輸送量和時延要求較高的應用情境。本文介紹如何基於支援eRDMA能力的ECS執行個體部署bRPC應用,並測試eRDMA對bRPC應用的效能提升效果。
步驟一:準備環境
本步驟需要建立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編譯。
依次登入2台ECS執行個體。
具體操作,請參見以SSH的方式登入Linux執行個體(支援私網)。
運行以下命令,修改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
解除記憶體鎖定的限制。對於使用eRDMA技術的應用需要較大記憶體,通常需要解除記憶體鎖定的限制,以提高資料轉送效率。
運行以下命令,編輯
limits.conf
檔案。sudo vi /etc/security/limits.conf
在檔案末尾添加以下內容並儲存檔案。
* soft memlock unlimited * hard memlock unlimited
運行以下命令,部署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
在使用eRDMA測試bRPC時,建議在server端和client端分別安裝以下補丁,以獲得更好的效能。
根據實際環境在
brpc
目錄下建立檔案,例如檔案名稱為erdma-multi-sge.patch
。樣本命令如下:cd ~/brpc sudo vi erdma-multi-sge.patch
增加以下內容並儲存檔案。
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
運行以下命令,將補丁檔案應用到bRPC的原始碼中。
patch -p1 < erdma-multi-sge.patch
運行以下命令,編譯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帶來的效能提升。
在以下兩種情境中分別測試bRPC的效能。
使用eRDMA功能
在server端運行以下命令,啟動server端並通過eRDMA進行通訊。
./server --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=true
在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功能
在server端運行以下命令,啟動server端並通過TCP進行通訊。
./server --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=false
在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
:用於設定請求隊列的深度,即隊列中可以同時存在的請求數量。較高的隊列深度有助於應對高並發情境下的請求洪峰,避免因隊列滿而導致的請求拒絕,但過大的隊列深度可能會佔用更多記憶體資源,請您根據實際測試需求合理設定。
擷取兩種測試結果,比較eRDMA對bRPC在時延(查看
Avg-Latency
欄位)和頻寬(查看QPS
欄位)等方面帶來的效能提升。