Por que a instância do Amazon Elastic Compute Cloud (Amazon EC2) está excedendo os limites da rede quando a utilização média é baixa?

Última atualização: 26-05-2022

Por que a instância do Amazon Elastic Compute Cloud (Amazon EC2) está excedendo os limites da rede quando a utilização média é baixa?

Breve descrição

Você pode consultar as métricas de performance da rede em tempo real em instâncias compatíveis com redes aprimoradas por meio do Elastic Network Adapter (ENA). Essas métricas fornecem um número cumulativo de pacotes enfileirados ou descartados em cada interface da rede desde a última reinicialização do driver. A seguir estão algumas das métricas do ENA:

  • bw_in_allowance_exceeded: o número de pacotes enfileirados ou descartados porque a largura de banda de entrada agregada excedeu o máximo para a instância.
  • bw_out_allowance_exceeded: o número de pacotes enfileirados ou descartados porque a largura de banda de saída agregada excedeu o máximo para a instância.
  • pps_allowance_exceeded: o número de pacotes enfileirados ou descartados porque o número de pacotes por segundo (PPS) bidirecionais excedeu o máximo para a instância.

Em alguns casos, você pode ver pacotes enfileirados ou descartados, mesmo que a largura de banda média ou o PPS, como vista no Amazon CloudWatch, sejam baixos. Por exemplo, as métricas NetworkIn, NetworkOut, NetworkPacketsIn ou NetworkPacketsOut no CloudWatch podem mostrar valores que não indicam que um limite foi atingido.

Resolução

Microbursts são a causa mais comum dos sintomas anteriores. Microbursts são breves picos na demanda seguidos por períodos de baixa ou nenhuma atividade. Esses bursts duram apenas segundos, milissegundos ou mesmo microssegundos. No caso de microbursts, as métricas do CloudWatch listadas na seção anterior não são suficientemente granulares para refleti-los.

Como as médias são calculadas

As métricas do EC2 no CloudWatch listadas na seção anterior são amostradas a cada um minuto. Essas métricas capturam o total de bytes ou pacotes transferidos nesse período. Essas amostras são então agregadas e publicadas no CloudWatch em períodos de cinco minutos. Cada estatística no período retorna um valor de amostra diferente:

  • Minimum (Mínimo) é o valor da amostra com o menor número de bytes/pacotes.
  • Maximum (Máximo) é o valor de amostra com o maior número de bytes/pacotes.
  • Sum (soma) é a soma de todos os valores de amostra.
  • SampleCount (Número de amostras) é o número de amostras agregadas (neste caso, cinco).
  • Average (Média) é o valor médio da amostra, calculado dividindo Sum (Soma) por SampleCount (Número de amostras).

O throughput médio ou PPS pode ser calculado de duas maneiras:

  • Divida Sum (Soma) por Período (Período) (por exemplo, 300 segundos) para uma média simples de 5 minutos.
  • Divida o Maximum (Máximo) por 60 segundos, para uma média no minuto com maior atividade.

Como microbursts são refletidos nas métricas do CloudWatch

Veja a seguir um exemplo de microburst e como ele é refletido no CloudWatch:

  • A instância tem uma performance de largura de banda da rede de 10 Gbps (1,25 GB/s).
  • Em uma determinada amostra (60 segundos), uma transferência de dados de saída de 20 GB usa toda a largura de banda disponível, fazendo com que bw_out_allowance_exceeded aumente. A transferência é concluída em cerca de 20 segundos e nenhum dado adicional é enviado posteriormente.
  • A instância permanece ociosa para as 4 amostras restantes (240 segundos).

Neste exemplo, o throughput médio em um período de cinco minutos é muito menor do que durante o microburst:

SUM(NetworkOut) / PERIOD = ((20 GB * 1 sample) + (0 GB * 4 samples)) / 300 seconds = ~0.066 GB/s * 8 bits = ~0.533 Gbps

Mesmo que você calcule o throughput com base na amostra mais alta, a média ainda não refletirá o valor do throughput:

MAXIMUM(NetworkOut) / 60 seconds = 20 GB / 60 = ~0.333 GB/s * 8 bits = ~2.667 Gbps

Monitorar microbursts

Para medir o throughput e o PPS em um nível mais granular, use as ferramentas do sistema operacional para monitorar as estatísticas da rede. Monitore as estatísticas da rede com mais frequência durante períodos de modelagem ou alta atividade.

Veja a seguir exemplos de ferramentas do sistema operacional:

Linux

  • sar
  • nload
  • iftop
  • iptraf-ng

Windows

  • Monitor de performance

O agente do CloudWatch pode ser usado no Linux e no Windows para publicar essas métricas de rede no nível do sistema operacional no CloudWatch como métricas personalizadas. Essas métricas podem ser publicadas em intervalos de até um segundo. Lembre-se de que métricas de alta resolução (aquelas com um período inferior a 60 segundos) geram cobranças mais altas. Para obter mais informações sobre preços do CloudWatch, consulte os preços do Amazon CloudWatch.

É uma prática recomendada monitorar as métricas de performance de rede fornecidas pelo ENA. A versão do driver deve ser maior ou igual a 2.2.10 (Linux) e 2.2.2 (Windows) para que você possa visualizar as métricas. Para obter mais informações, consulte as páginas relevantes para Linux e Windows. O agente do CloudWatch também pode publicar métricas do ENA.

Para obter instruções sobre como publicar métricas do ENA para Linux, consulte Coletar métricas de performance de rede. Para o Windows, as métricas do ENA estão disponíveis no Monitor de performance, e o agente do CloudWatch pode publicar lá qualquer métrica disponível.

Prevenir microbursts

Para evitar microbursts, o tráfego precisa ser monitorado nos remetentes para não exceder o máximo throughput ou taxa de pacotes. Isso torna os microbursts difíceis de evitar. A velocidade do tráfego no remetente geralmente requer alterações no nível da aplicação. Dependendo de como essa alteração é implementada, pode ser necessário que o sistema operacional seja compatível com temporização de tráfego e que ela esteja disponível e ativada no remetente. Isso pode nem sempre ser possível ou prático. Os microbursts também acontecem como resultado de muitas conexões enviando pacotes em um curto período e, nesse caso, a temporização de remetentes individuais não resolve.

Por esses motivos, é uma prática recomendada monitorar as métricas do ENA, como dito anteriormente. Se os limites estiverem sendo atingidos com frequência ou se houver evidências de que isso esteja afetando as aplicações, faça o seguinte:

  • Aumente a escala verticalmente: passe para um tamanho de instância maior. Instâncias maiores geralmente têm cotas mais altas. Instâncias otimizadas para rede (como instância com um “n”, como em C5n) têm cotas mais altas do que suas respectivas contrapartes não otimizadas para rede.
  • Aumente a escala horizontalmente: distribua o tráfego entre várias instâncias para reduzir o tráfego e a contenção em instâncias individuais.

No Linux, além das opções anteriores, existem possíveis opções de mitigação para usuários avançados:

  • SO_MAX_PACING_RATE: Esta opção de soquete pode ser passada para setsockopt por uma aplicação para especificar uma taxa de temporização máxima (bytes por segundo). O kernel do Linux temporiza o tráfego desse soquete para não exceder o limite. Essa opção requer o seguinte:
    Alterações de código no nível da aplicação.
    Suporte do kernel.
    O uso da disciplina de enfileiramento Fair Queue (FQ) ou a compatibilidade do kernel com temporização na camada TCP (aplicável somente ao TCP).
  • Disciplinas de enfileiramento (qdiscs): Alguns qdiscs são compatíveis com formatação de tráfego em vários níveis. Para obter mais informações, consulte a página do manual Traffic Control (TC) (Controle de tráfego).
  • Filas de transmissão rasas (Tx): em alguns cenários, filas de Tx rasas ajudam a reduzir o controle de utilização de PPS. Isso pode ser alcançado de duas maneiras:
    Limites de fila de bytes (BQL): o BQL limita dinamicamente a quantidade de bytes em trânsito nas filas de Tx. O BQL é ativado por padrão nas versões do driver do ENA fornecidas com o kernel Linux (aquelas que terminam com um “K”). Para versões do driver do ENA do GitHub (aquelas que terminam com um “g”), o BQL está disponível a partir da versão v2.6.1g e é desativado por padrão. Você pode ativar o BQL usando o parâmetro enable_bql do módulo do ENA.
    Comprimento reduzido da fila de Tx: reduza o comprimento da fila de Tx do padrão de 1.024 pacotes para uma quantidade menor (mínimo de 256). Você pode alterar esse comprimento usando a ferramenta ethtool.