Aprimorar a latência de rede para instâncias do EC2 baseadas no Linux
A latência de rede corresponde à quantidade de tempo que um pacote de dados demora para se deslocar da origem até o destino. As aplicações que enviam dados pela rede dependem de respostas em tempo hábil para fornecer uma experiência positiva ao usuário. A alta latência de rede pode acarretar diversos problemas, como os seguintes:
-
Tempos de carregamento lentos para páginas da Web.
-
Atraso na transmissão de vídeo.
-
Dificuldade de acesso aos recursos online.
Esta seção descreve as etapas que podem ser seguidas para aprimorar a latência de rede em instâncias do Amazon EC2 executadas em Linux. Para obter a latência ideal, siga estas etapas para definir as configurações de sua instância, kernel e driver ENA. Para obter orientação de configurações adicionais, consulte o Guia de práticas recomendadas e otimização de performance para o driver ENA do Linux
nota
As etapas e configurações podem variar um pouco, dependendo do hardware de rede específico, da AMI da qual você executou a instância e do caso de uso da aplicação. Antes de realizar qualquer alteração, teste e monitore minuciosamente a performance da rede para garantir que esteja obtendo os resultados desejados.
Reduzir o número de saltos de rede para pacotes de dados
Cada salto que um pacote de dados tem ao se mover de um roteador para outro aumenta a latência da rede. Normalmente, o tráfego passa por diversos saltos para chegar ao seu destino. Há duas maneiras de reduzir os saltos de rede para as instâncias do Amazon EC2, conforme apresentado a seguir:
-
Grupo com posicionamento em cluster: ao especificar um grupo com posicionamento em cluster, o Amazon EC2 executa instâncias que estão com grande proximidade umas das outras, fisicamente na mesma zona de disponibilidade (AZ) comempacotamento mais restrito. A proximidade física das instâncias no grupo permite que elas aproveitem a conectividade de alta velocidade, resultando em baixa latência e alta throughput de fluxo único.
-
Host dedicado: um host dedicado é um servidor físico dedicado para seu uso. Com um host dedicado, é possível executar as instâncias no mesmo servidor físico. A comunicação entre instâncias executada no mesmo host dedicado pode ocorrer sem nenhum salto extra de rede.
Como a configuração do kernel do Linux afeta a latência
A configuração do kernel do Linux pode aumentar ou diminuir a latência da rede. Para atingir suas metas de otimização de latência, é importante ajustar a configuração do kernel do Linux de acordo com os requisitos específicos de sua workload.
Existem várias opções de configuração para o kernel do Linux que podem ajudar a diminuir a latência da rede. As opções mais impactantes são as seguintes.
-
Ativação do modo de pesquisa ocupada: o modo de pesquisa ocupada reduz a latência no caminho de recebimento da rede. Ao ativar o modo de pesquisa ocupada, o código da camada de soquete pode pesquisar diretamente a fila de recebimento de um dispositivo de rede. A desvantagem de uma sondagem ocupada é o maior uso da CPU no host, resultante da sondagem de novos dados em um ciclo restrito. Há duas configurações globais que controlam o número de microssegundos para aguardar os pacotes para todas as interfaces.
busy_read
-
Um tempo limite de sondagem ocupada de baixa latência para leituras de soquete. Ele controla o número de microssegundos a aguardar para camada de soquete ler os pacotes na fila de dispositivos. Para habilitar o recurso globalmente com o comando sysctl, a organização Linux Kernel recomenda um valor de 50 microssegundos. Para obter mais informações, consulte busy_read
no Guia do usuário e do administrador do kernel doo Linux. [ec2-user ~]$
sudo sysctl -w net.core.busy_read=50
busy_poll
-
Um tempo limite de sondagem ocupada de baixa latência para sondagem e seleção. Isso controla o número de microssegundos a aguardar por eventos. O valor recomendado está entre 50-100 microssegundos, dependendo do número de soquetes que você estiver sondando. Quanto mais soquetes você adicionar, maior deve ser o número.
[ec2-user ~]$
sudo sysctl -w net.core.busy_poll=50
-
Configuração dos estados de energia da CPU (C-states): os C-states controlam os níveis de suspensão em que um núcleo pode entrar quando está inativo. Você pode desejar controlar os C-states para ajustar o sistema em relação à latência versus performance. Em estados C mais profundos, a CPU está essencialmente “adormecida” e não poderá responder às solicitações até acordar e fazer a transição de volta ao estado ativo. Desativar núcleos leva tempo e, embora um núcleo desativado forneça mais espaço para um núcleo funcionar em uma frequência mais alta, leva tempo para que esse núcleo desativado seja reativado e execute o trabalho.
Por exemplo, se um núcleo que receber a tarefa de lidar com interrupções de pacotes da Internet estiver desativado, poderá ocorrer um atraso em lidar com essa interrupção. É possível configurar o sistema para que ele não use estados C mais profundos. No entanto, embora essa configuração reduza a latência de reação do processador, ela também reduz o espaço disponível para outros núcleos para o Turbo Boost.
Para reduzir a latência de reação do processador, é possível limitar mais profundamente os C-states. Para obter mais informações, consulte High performance and low latency by limiting deeper C-states no Amazon Linux 2 User Guide.
Configuração do driver de rede do ENA
O driver de rede ENA possibilita a comunicação entre uma instância e uma rede. O driver processa os pacotes de rede e os repassa à pilha de rede ou ao cartão Nitro. Quando um pacote de rede chega, o cartão Nitro gera uma interrupção para a CPU notificar o software sobre um evento.
- Interromper
-
Uma interrupção é um sinal que um dispositivo ou aplicação envia ao processador. A interrupção informa ao processador que ocorreu um evento ou que foi atendida uma condição que requer atenção imediata. As interrupções podem lidar com tarefas urgentes, como receber dados de uma interface de rede, lidar com eventos de hardware ou atender a solicitações de outros dispositivos.
- Moderação de interrupção
-
A moderação de interrupções é uma técnica que reduz o número de interrupções que um dispositivo gera agregando ou atrasando-as. O objetivo da moderação de interrupções é melhorar o desempenho do sistema, reduzindo a sobrecarga associada ao tratamento de um grande número de interrupções. Interrupções demais aumentam o uso da CPU, afetando negativamente a throughput, enquanto poucas interrupções aumentam a latência.
- Moderação dinâmico de interrupções
-
A moderação dinâmica de interrupções é uma forma aprimorada de moderação de interrupção que ajusta dinamicamente a taxa de interrupções com base nos padrões atuais de carga e tráfego do sistema. O objetivo é encontrar um equilíbrio entre reduzir a sobrecarga de interrupções e os pacotes por segundo, ou a largura de banda.
nota
A moderação dinâmica de interrupções é habilitada por padrão em algumas AMIs (mas pode ser habilitada ou desabilitada em todas as AMIs).
Para minimizar a latência da rede, pode ser necessário desabilitar a moderação de interrupções. No entanto, isso também pode aumentar a sobrecarga do processamento de interrupção. É importante descobrir o balanceamento adequado entre reduzir a latência e minimizar a sobrecarga. Os comandos ethtool
podem ajudar você a configurar a moderação de interrupção. Por padrão, rx-usecs
está definido como 20
e tx-usecs
está definido como 64
.
Para obter a configuração de modificação de interrupção atual, use o comando a seguir.
[ec2-user ~]$
ethtool -cinterface
| egrep "rx-usecs:|tx-usecs:|Adaptive RX"Adaptive RX: on TX: off rx-usecs: 20 tx-usecs: 64
Para desativar a modificação de interrupções, use o comando a seguir.
[ec2-user ~]$
sudo ethtool -Cinterface
adaptive-rx off rx-usecs 0 tx-usecs 0