O NetACC é uma biblioteca em modo usuário que acelera aplicações TCP via eRDMA com interfaces de socket compatíveis — sem necessidade de alterações no código.
O NetACC está em preview público.
Casos de uso
O NetACC é indicado para cenários com alta sobrecarga de rede.
Cargas de trabalho com alta taxa de pacotes por segundo (PPS), especialmente tráfego de pacotes pequenos. O NetACC reduz a sobrecarga de CPU e aumenta a throughput, como quando o Redis processa requisições.
Cargas de trabalho sensíveis a latência: o eRDMA oferece latência menor que o TCP, acelerando as respostas de rede.
Conexões de curta duração frequentes: o NetACC acelera o estabelecimento de conexões, reduzindo o tempo de criação e melhorando o desempenho.
Instalar o NetACC
Métodos de instalação
Usar o driver eRDMA para instalar o NetACC
O NetACC é instalado automaticamente com o driver eRDMA. Consulte Ativar o eRDMA no tópico "Usar o eRDMA".
Instalar o NetACC separadamente
Para instalar uma versão específica do NetACC ou usá-lo temporariamente em uma instância ECS, execute:
sudo curl -fsSL https://netacc-release.oss-cn-hangzhou.aliyuncs.com/release/netacc_download_install.sh | sudo sh
Arquivo de configuração e parâmetros otimizados
Após a instalação, o arquivo de configuração
/etc/netacc.confé gerado automaticamente. Você pode ajustar os seguintes parâmetros de acordo com a sua carga de trabalho:NACC_SOR_MSG_SIZE: tamanho do buffer.NACC_RDMA_MR_MIN_INC_SIZE: tamanho da primeira Memory Region (MR) registrada pelo RDMA.NACC_RDMA_MR_MAX_INC_SIZE: tamanho máximo da MR registrada pelo RDMA.NACC_SOR_CONN_PER_QP: conexões por Queue Pair (QP).NACC_SOR_IO_THREADS: número de threads do NetACC.
O exemplo a seguir mostra um arquivo de configuração de amostra:
Usar o NetACC
Use o NetACC em aplicações executando o comando netacc_run ou definindo a variável de ambiente LD_PRELOAD. Leia a seção Notas de uso antes de prosseguir.
Executar o comando netacc_run
O netacc_run carrega o NetACC na inicialização da aplicação. Adicione o prefixo netacc_run ao comando da sua aplicação para iniciá-la com o NetACC ativado.
O netacc_run aceita parâmetros como -t (threads de I/O) e -p (conexões por QP). Os parâmetros especificados ao executar o comando netacc_run substituem os valores do arquivo de configuração.
Exemplos:
Os exemplos a seguir usam o Redis. Adicione o prefixo
netacc_runa um comando do Redis para iniciá-lo com o NetACC.Iniciar o Redis com o NetACC:
netacc_run redis-serverIniciar o redis-benchmark com o NetACC:
netacc_run redis-benchmark
Configurar a variável de ambiente LD_PRELOAD
A variável de ambiente LD_PRELOAD especifica as bibliotecas compartilhadas pré-carregadas na inicialização do programa. Defina-a como a biblioteca do NetACC na variável LD_PRELOAD para automatizar o carregamento.
Consulte a localização da biblioteca dinâmica do NetACC:
ldconfig -p | grep netaccSaída de amostra:
[ecs-user@i ~]$ ldconfig -p | grep netacc libnetacc-preload.so (libc6,x86-64) => /lib64/libnetacc-preload.so libnetacc_cx.so (libc6,x86-64) => /lib64/libnetacc_cx.so [ecs-user@i ~]$Defina a variável de ambiente
LD_PRELOADcomo a biblioteca compartilhada do NetACC:LD_PRELOAD=/lib64/libnetacc-preload.so your_applicationSubstitua
your_applicationpela aplicação de destino.Exemplos (Redis):
Iniciar o Redis com o NetACC:
LD_PRELOAD=/lib64/libnetacc-preload.so redis-serverIniciar o redis-benchmark com o NetACC:
LD_PRELOAD=/lib64/libnetacc-preload.so redis-benchmark
Monitorar o NetACC
O netacc_ss é a ferramenta de monitoramento do NetACC. Execute o comando netacc_ss para verificar o status de transferência de dados dos processos TCP acelerados pelo NetACC. É possível executá-lo tanto no servidor quanto no cliente.
Consulte o status de transferência de dados dos processos TCP acelerados pelo NetACC:
netacc_ss -s all -p <Process ID>Para consultar um ID de processo, execute ps -ef | grep <Process name>.
Notas de uso
Apenas as conexões TCP estabelecidas por meio de ENIs com o recurso eRDMA Interface (ERI) ativado são convertidas para conexões RDMA. As demais conexões permanecem como TCP.
NotaSe nenhum dos lados da comunicação tiver uma ENI com ERI ativado, o NetACC usa o TCP como fallback.
Os descritores de arquivo de socket RDMA não podem ser enviados para outros processos via IPC do kernel.
NotaAs conexões RDMA estão vinculadas a QPs específicos que não podem ser compartilhados entre processos.
O NetACC não oferece suporte ao IPv6. Para evitar conflitos, desative o IPv6 executando
sysctl net.ipv6.conf.all.disable_ipv6=1.O NetACC não oferece suporte a atualizações a quente. Pare todos os processos acelerados pelo NetACC antes de atualizá-lo.
O NetACC não oferece suporte a determinadas opções de socket TCP, como SO_REUSEPORT, SO_ZEROCOPY e TCP_INQ.
O NetACC depende do glibc e não pode ser executado em ambientes sem glibc, como o Golang.
Antes de usar o NetACC, defina o limite máximo de memória bloqueável como ilimitado executando
ulimit -l unlimited.NotaSe o valor de ulimit -l for muito baixo, o RDMA pode falhar ao registrar MRs que excedam o limite.
Quando uma aplicação acelerada pelo NetACC escuta em uma porta TCP, o NetACC também escuta em uma porta RDMA (porta TCP + 20000) para transferência de dados via RDMA.
NotaSe a porta RDMA estiver ocupada ou fora do intervalo válido, a conexão falhará. Aloque as portas corretamente para evitar conflitos.
Um processo filho não herda as conexões de socket estabelecidas pelo processo pai após uma chamada
fork().NotaO processo filho deve estabelecer uma nova conexão de socket.
A reutilização de QP está desativada por padrão.
Para ativar a reutilização de QP, defina conexões por QP (-p) com um valor maior que 1 por meio do parâmetro
NACC_SOR_CONN_PER_QPno arquivo de configuração do NetACC ou no comandonetacc_run.A reutilização de QP reduz a quantidade de QPs, a sobrecarga de gerenciamento e o consumo de recursos, melhorando a eficiência da comunicação em cenários de alta concorrência.
Com a reutilização de QP ativada, várias conexões RDMA podem compartilhar um número de porta local, pois os números de porta identificam QPs, não conexões individuais.
NotaSe as suas aplicações exigirem números de porta local distintos (por exemplo, para serviços diferentes), desative a reutilização de QP para evitar conflitos de porta.
Usar o NetACC em aplicações Redis
Benefícios do NetACC para aplicações Redis
Aumento da throughput do sistema
O NetACC reduz a sobrecarga de CPU e aumenta a throughput para cargas de trabalho Redis com alto PPS.
Respostas de rede aceleradas
O NetACC aproveita a baixa latência do eRDMA para acelerar as respostas de rede do Redis.
Benchmarks de desempenho do Redis com o NetACC
O Redis-benchmark é um utilitário integrado do Redis que mede o desempenho do servidor simulando requisições de clientes concorrentes.
Cenário de teste
Use o NetACC com o redis-benchmark para simular 100 clientes em 4 threads enviando 5 milhões de requisições SET.
Pré-requisitos
Crie duas instâncias ECS compatíveis com eRDMA. Selecione Auto-install eRDMA Driver e eRDMA Interface para ativar o ERI na ENI primária. Use uma instância como servidor Redis e a outra como cliente.
Configurações das instâncias:
Imagem: Alibaba Cloud Linux 3
Tipo de instância: ecs.g8ae.4xlarge
Endereço IP privado da ENI primária: 172.17.0.90 (servidor) e 172.17.0.91 (cliente). Substitua pelos valores reais no seu benchmark.
NotaEste benchmark ativa o ERI nas ENIs primárias. 172.17.0.90 é o IP privado da ENI primária da instância do servidor Redis.
Se o ERI estiver ativado nas ENIs secundárias, use os endereços IP privados delas. Consulte Ativar o eRDMA no tópico "Usar o eRDMA".
Procedimento
Conecte-se a ambas as instâncias ECS (servidor Redis e cliente).
Consulte Usar o Workbench para fazer logon em uma instância Linux via SSH.
Verifique se o driver eRDMA está instalado.
Após o início das instâncias, execute
ibv_devinfopara verificar o status do driver eRDMA.A saída a seguir indica que o driver está instalado.
[root@redis-server ~]# ibv_devinfo hca_id: erdma_0 transport: eRDMA (1) fw_ver: 0.2.0 node_guid: 0216:3eff:fe10:d924 sys_image_guid: 0216:3eff:fe10:d924 vendor_id: 0x1ded vendor_part_id: 4223 hw_ver: 0x0 phys_port_cnt: 1 port: 1 state: PORT_ACTIVE (4) max_mtu: 1024 (3) active_mtu: 1024 (3) sm_lid: 0 port_lid: 0 port_lmc: 0x00 link_layer: Ethernet [root@redis-server ~]#A saída a seguir indica que o driver está sendo instalado. Aguarde alguns minutos e tente novamente.
[root@ixxxxxxxxxxxxx Z ~]# ibv_deninfo -bash: ibv_deninfo: command not found
Instale o Redis em ambas as instâncias:
sudo yum install -y redisA saída a seguir indica que o Redis foi instalado.
[root@redis-server ~]# sudo yum install -y redis Last metadata expiration check: 0:06:35 ago on Tue 03 Sep 2024 10:50:07 AM CST. Dependencies resolved. ================================================================================ Package Architecture Version Repository Size ================================================================================ Installing: redis x86_64 6.2.7-1.0.2.al8 alinux3-updates 1.2 M Transaction Summary ================================================================================ Install 1 Package Total download size: 1.2 M Installed size: 4.3 M Downloading Packages: redis-6.2.7-1.0.2.al8.x86_64.rpm 15 MB/s | 1.2 MB 00:00 -------------------------------------------------------------------------------- Total 15 MB/s | 1.2 MB 00:00 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Running scriptlet: redis-6.2.7-1.0.2.al8.x86_64 1/1 Installing : redis-6.2.7-1.0.2.al8.x86_64 1/1 Running scriptlet: redis-6.2.7-1.0.2.al8.x86_64 1/1 Verifying : redis-6.2.7-1.0.2.al8.x86_64 1/1 Installed: redis-6.2.7-1.0.2.al8.x86_64 Complete! [root@redis-server ~]#Execute o benchmark de desempenho do Redis com o
redis-benchmark.Executar um benchmark usando o NetACC
Na instância do servidor Redis, inicie o Redis com o NetACC:
netacc_run redis-server --port 6379 --protected-mode noNotaSubstitua 6379 pela porta real. Consulte Parâmetros comuns usados com o comando redis-server.
Este exemplo usa o
netacc_run. Para outros métodos, consulte Usar o NetACC.
A saída a seguir indica que o Redis foi iniciado com êxito.
[root@redis-server ~]# netacc_run redis-server --port 6379 --protected-mode no 114379:C 03 Sep 2024 10:59:24.477 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 114379:C 03 Sep 2024 10:59:24.477 # Redis version=6.2.7, bits=64, commit=00000000, modified=0, pid=114379, just started 114379:C 03 Sep 2024 10:59:24.477 # Configuration loaded 114379:M 03 Sep 2024 10:59:24.478 * monotonic clock: POSIX clock_gettime 114379:M 03 Sep 2024 10:59:24.479 # A key '__redis__compare_helper' was added to Lua globals which is not on the globals allow list nor listed on the deny list. Redis 6.2.7 (00000000/0) 64 bit Running in standalone mode Port: 6379 PID: 114379 https://redis.io 114379:M 03 Sep 2024 10:59:24.479 # Server initialized 114379:M 03 Sep 2024 10:59:24.479 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 114379:M 03 Sep 2024 10:59:24.479 * Ready to accept connectionsNa instância do cliente Redis, inicie o redis-benchmark com o NetACC:
netacc_run redis-benchmark -h 172.17.0.90 -p 6379 -c 100 -n 5000000 -r 10000 --threads 4 -d 512 -t setNotaSubstitua 172.17.0.90 pelo IP do servidor Redis e 6379 pela porta real. Consulte Parâmetros comuns usados com o redis-benchmark.
Os resultados do benchmark podem variar de acordo com as condições da rede. Os dados neste tópico são apenas para referência.
O Summary mostra aproximadamente 770.000 requisições/segundo. Para detalhes das métricas, consulte Métricas comuns nos resultados do benchmark do redis-benchmark.
Executar um benchmark sem o NetACC
Na instância do servidor Redis, inicie o Redis:
redis-server --port 6379 --protected-mode no --saveNotaSubstitua 6379 pela porta real. Consulte Parâmetros comuns usados com o comando redis-server.
A saída a seguir indica que o Redis foi iniciado com êxito.
[root@redis-server ~]# redis-server --port 6379 --protected-mode no --save 114198:C 03 Sep 2024 10:57:28.957 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 114198:C 03 Sep 2024 10:57:28.957 # Redis version=6.2.7, bits=64, commit=00000000, modified=0, pid=114198, just started 114198:C 03 Sep 2024 10:57:28.957 # Configuration loaded 114198:M 03 Sep 2024 10:57:28.958 * monotonic clock: POSIX clock_gettime 114198:M 03 Sep 2024 10:57:28.958 # A key '__redis__compare_helper' was added to Lua globals which is not on the globals allow list nor listed on the deny list. Redis 6.2.7 (00000000/0) 64 bit Running in standalone mode Port: 6379 PID: 114198 https://redis.io 114198:M 03 Sep 2024 10:57:28.958 # Server initialized 114198:M 03 Sep 2024 10:57:28.958 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 114198:M 03 Sep 2024 10:57:28.958 * Ready to accept connectionsNa instância do cliente Redis, inicie o redis-benchmark:
redis-benchmark -h 172.17.0.90 -c 100 -n 5000000 -r 10000 --threads 4 -d 512 -t setNotaSubstitua 172.17.0.90 pelo IP do servidor Redis e 6379 pela porta real. Consulte Parâmetros comuns usados com o redis-benchmark.
Os resultados do benchmark podem variar de acordo com as condições da rede. Os dados neste tópico são apenas para referência.
O Summary mostra aproximadamente 330.000 requisições/segundo. Para detalhes das métricas, consulte Métricas comuns nos resultados do benchmark do redis-benchmark.