基于支持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
字段)等方面带来的性能提升。