Implante o bRPC em instâncias ECS compatíveis com eRDMA para obter menor latência, maior throughput e uso reduzido de CPU.
O bRPC é um framework RPC de alto desempenho e uso geral escrito em C++. Ele fornece ferramentas que simplificam o desenvolvimento e a implantação de services. Os casos de uso comuns incluem pesquisa, armazenamento, machine learning e publicidade. O bRPC é adequado para microsserviços de alta concorrência e baixa latência, além de sistemas distribuídos em grande escala. Consulte as instruções de compilação do bRPC.
O eRDMA (elastic Remote Direct Memory Access) é um service de rede RDMA nativo da cloud que oferece baixa latência, alto throughput e alta elasticidade. Consulte Overview of eRDMA.
Etapa 1: Preparar o ambiente
Crie duas instâncias ECS compatíveis com eRDMA para atuar como servidor e cliente. Especifique os seguintes itens de configuração:
Tipo de instância: Escolha um tipo de instância compatível com eRDMA. Consulte Limits. Este tópico utiliza ecs.g8a.8xlarge.
Imagem: Escolha uma imagem compatível com eRDMA. Consulte Limits. Este tópico utiliza Alibaba Cloud Linux 3.2104 LTS 64 bits.
-
Instale o driver eRDMA: Selecione Install eRDMA driver. O driver é instalado automaticamente durante a inicialização da instância.
NotaApós a inicialização da instância, aguarde de 3 a 5 minutos para que a instalação do driver seja concluída. Consulte Enable eRDMA on enterprise-level instances.
-
Rede:
Ative o acesso à Internet para ambas as instâncias.
A interconexão de services é ativada por padrão dentro da mesma VPC.
Para a ENI, selecione Elastic RDMA interface ao lado da NIC.
Para outros parâmetros, consulte Customize and purchase an instance.
Etapa 2: Implantar e compilar o bRPC
Implante e compile o bRPC em ambas as instâncias. As etapas a seguir usam o Alibaba Cloud Linux 3 como exemplo. Para outros sistemas operacionais, consulte Compilar o bRPC.
Faça login em ambas as instâncias ECS. Consulte Use Workbench to log on to a Linux instance.
-
Modifique o modo de estabelecimento de conexão para eRDMA e bRPC para garantir compatibilidade.
NotaPor padrão, o eRDMA usa RDMA_CM para estabelecer conexões, enquanto o bRPC usa o modo Out-of-Band (OOB). Modifique o modo de conexão de ambos para garantir a compatibilidade.
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 -
Remova os limites de bloqueio de memória. Aplicações eRDMA geralmente exigem grandes quantidades de memória.
-
Edite o arquivo
limits.conf.sudo vi /etc/security/limits.conf -
Adicione as seguintes linhas ao final do arquivo e salve.
* soft memlock unlimited * hard memlock unlimited
-
-
Implante a aplicação 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 -
Aplique o seguinte patch em ambas as instâncias para melhorar o desempenho do bRPC com eRDMA.
-
No diretório
brpc, crie um arquivo chamadoerdma-multi-sge.patch:cd ~/brpc sudo vi erdma-multi-sge.patch -
Adicione o seguinte conteúdo e salve.
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 -
Aplique o patch ao código-fonte do bRPC.
patch -p1 < erdma-multi-sge.patch -
Compile o código-fonte do bRPC.
sh config_brpc.sh --with-rdma --headers="/usr/include" --libs="/usr/lib64 /usr/bin" make -j cd example/rdma_performance; make -j
-
Etapa 3: Testar o desempenho
Teste o desempenho do bRPC com e sem eRDMA e compare os resultados.
-
Teste o desempenho do bRPC nos dois cenários a seguir.
Com eRDMA ativado
-
No servidor, inicie o server com eRDMA ativado.
./server --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=true -
No cliente, conecte-se ao servidor com eRDMA ativado.
./client --servers=<server private IP address>:8002 --rpc_timeout_ms=-1 --attachment_size=1024 --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=true --queue_depth=16Parâmetros:
Substitua
<server private IP address>pelo endereço IP privado do servidor.--attachment_size: tamanho dos dados anexados a cada chamada bRPC. Valores maiores aproveitam melhor o eRDMA, mas aumentam a complexidade do gerenciamento de memória. Defina conforme seus requisitos de teste.--queue_depth: número de solicitações simultâneas que a fila pode manter. Uma profundidade maior ajuda a lidar com picos de tráfego, mas consome mais memória. Defina conforme seus requisitos de teste.
Sem eRDMA ativado
-
No servidor, inicie o server com TCP.
./server --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=false -
No cliente, conecte-se ao servidor com TCP.
./client --servers=<server private IP address>:8002 --rpc_timeout_ms=-1 --attachment_size=1024 --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=false --queue_depth=16Parâmetros:
Substitua
<server private IP address>pelo endereço IP privado do servidor.--attachment_size: tamanho dos dados anexados a cada chamada bRPC. Valores maiores aproveitam melhor o eRDMA, mas aumentam a complexidade do gerenciamento de memória. Defina conforme seus requisitos de teste.--queue_depth: número de solicitações simultâneas que a fila pode manter. Uma profundidade maior ajuda a lidar com picos de tráfego, mas consome mais memória. Defina conforme seus requisitos de teste.
-
Compare os resultados de ambos os cenários. Verifique o campo
Avg-Latencypara latência e o campoQPSpara throughput, a fim de avaliar os ganhos de desempenho do eRDMA.