Faça deploy do bRPC em instâncias ECS compatíveis com eRDMA para obter menor latência, maior throughput e menor uso de CPU.
-
O bRPC é um framework de RPC de alto desempenho e uso geral em C++. Ele fornece ferramentas para simplificar o desenvolvimento e o deploy de serviços. Os casos de uso comuns incluem pesquisa, armazenamento, machine learning e publicidade. O bRPC é adequado para microsserviços de alta simultaneidade e baixa latência, além de sistemas distribuídos de grande escala. Consulte as instruções de compilação do bRPC.
-
O eRDMA (elastic Remote Direct Memory Access) é um serviço de rede RDMA nativo da nuvem que oferece baixa latência, alto throughput e alta elasticidade. Consulte Visão geral do eRDMA.
Etapa 1: preparar o ambiente
Crie duas instâncias ECS compatíveis com eRDMA para funcionar 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 Limites. Este tópico usa ecs.g8a.8xlarge.
-
Imagem: escolha uma imagem compatível com eRDMA. Consulte Limites. Este tópico usa Alibaba Cloud Linux 3.2104 LTS 64-bit.
-
Instale o driver eRDMA: Selecione Install eRDMA driver. O driver é instalado automaticamente durante a inicialização da instância.
nullApós a inicialização da instância, aguarde de 3 a 5 minutos para a conclusão da instalação do driver. Consulte Ativar eRDMA em instâncias de nível empresarial.
-
Rede:
-
Ative o acesso à Internet para ambas as instâncias.
-
A interconexão de serviços é ativada por padrão no mesmo VPC.
-
Para ENI, selecione Elastic RDMA interface ao lado da NIC.
-
Para outros parâmetros, consulte Personalizar e adquirir uma instância.
Etapa 2: deploy e compilação do bRPC
Faça deploy 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 logon em ambas as instâncias ECS. Consulte Usar o Workbench para fazer logon em uma instância Linux.
-
Modifique o modo de estabelecimento de conexão do eRDMA e do bRPC para garantir a compatibilidade.
nullPor padrão, o eRDMA usa o 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. Os aplicativos eRDMA normalmente exigem grandes quantidades de memória.
-
Edite o arquivo
limits.conf.sudo vi /etc/security/limits.conf -
Adicione as linhas a seguir ao final do arquivo e salve.
* soft memlock unlimited * hard memlock unlimited
-
-
Faça deploy do aplicativo 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 patch a seguir 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 conteúdo a seguir 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 servidor 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: o tamanho dos dados anexados a cada chamada bRPC. Valores maiores aproveitam melhor o eRDMA, mas aumentam a complexidade do gerenciamento de memória. Defina de acordo com os requisitos do teste. -
--queue_depth: o número de solicitações simultâneas que a fila pode conter. Uma profundidade maior ajuda a lidar com picos de tráfego, mas consome mais memória. Defina de acordo com os requisitos do teste.
-
Sem eRDMA ativado
-
No servidor, inicie o servidor 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: o tamanho dos dados anexados a cada chamada bRPC. Valores maiores aproveitam melhor o eRDMA, mas aumentam a complexidade do gerenciamento de memória. Defina de acordo com os requisitos do teste. -
--queue_depth: o número de solicitações simultâneas que a fila pode conter. Uma profundidade maior ajuda a lidar com picos de tráfego, mas consome mais memória. Defina de acordo com os requisitos do teste.
-
-
-
Compare os resultados dos dois cenários. Verifique o campo
Avg-Latencypara latência e o campoQPSpara throughput a fim de avaliar os ganhos de desempenho do eRDMA.