基于支持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。
網絡:
均需開通公網。
在同一個專有網絡VPC,默認內網互通。
彈性網卡:在網卡右側選中彈性RDMA接口。
其他更多的參數說明,請參見自定義購買實例。
步驟二:部署并編譯bRPC
分別在2臺ECS實例(server端和client端)上部署并編譯bRPC。本示例以Alibaba Cloud Linux 3操作系統為例,其他操作系統部署bRPC的方法,請參見bRPC編譯。
依次登錄2臺ECS實例。
具體操作,請參見通過密碼或密鑰認證登錄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
字段)等方面帶來的性能提升。