基于eRDMA部署高网络性能的bRPC应用

基于支持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

  • 网络:

    • 均需开通公网。

    • 在同一个专有网络VPC,默认内网互通。

    • 弹性网卡:在网卡右侧选中弹性RDMA接口

其他更多的参数说明,请参见自定义购买实例

步骤二:部署并编译bRPC

分别在2台ECS实例(server端和client端)上部署并编译bRPC。本示例以Alibaba Cloud Linux 3操作系统为例,其他操作系统部署bRPC的方法,请参见bRPC编译

  1. 依次登录2台ECS实例。

    具体操作,请参见通过密码或密钥认证登录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字段)等方面带来的性能提升。