Em versões mais antigas do kernel, o uso do Bottleneck Bandwidth and Round-trip propagation time (BBR) como algoritmo de controle de congestionamento TCP sem o agendador qdisc fq causa alta sobrecarga de CPU por conexão e degrada o desempenho da rede em cargas de trabalho como bancos de dados Redis. Este tópico explica a causa e apresenta três soluções.
Versões afetadas
Esse problema afeta instâncias do Elastic Compute Service (ECS) que atendem a todas as condições a seguir:
Versão da imagem:
aliyun_2_1903_64_20G_alibase_20190619.vhdou anteriorVersão do kernel:
kernel-4.19.48-14.al7ou anteriorAlta utilização de CPU e alta taxa de encaminhamento de pacotes simultâneas
Causa
Se o BBR for o algoritmo ativo de controle de congestionamento TCP, mas o qdisc da interface de rede não usar o agendador fq, a pilha TCP recorrerá ao timer interno de alta resolução (hrtimer). Esse comportamento aumenta a utilização de CPU por conexão.
Escolha uma solução
Selecione a solução adequada ao seu cenário de rede:
|
Cenário |
Solução |
|
A instância atende tráfego apenas pela rede interna |
|
|
A instância atende tráfego pela Internet |
|
|
Nenhuma das opções é viável ou você deseja uma correção definitiva |
Alternar para CUBIC
O CUBIC é ideal para ambientes de rede interna com alta largura de banda e baixa latência. A mudança para CUBIC elimina a sobrecarga do hrtimer causada pelo BBR na ausência do agendador fq.
-
Aplique a alteração imediatamente.
sudo sysctl -w net.ipv4.tcp_congestion_control=cubic -
Torne a alteração persistente entre reinicializações.
echo "net.ipv4.tcp_congestion_control=cubic" | sudo tee -a /etc/sysctl.d/50-aliyun.conf -
Verifique o algoritmo ativo.
sysctl net.ipv4.tcp_congestion_controlSaída esperada:
net.ipv4.tcp_congestion_control = cubic
Alterar qdisc para fq
Para instâncias que atendem tráfego da Internet, configure o agendador fq na interface de rede elimina a necessidade de fallback para hrtimer do BBR. Essa configuração reduz a sobrecarga de CPU por conexão e mantém o BBR ativo.
O comando a seguir aplica a alteração apenas até a próxima reinicialização. Para tornar a configuração persistente, adicione o comando a um script de inicialização ou configure o qdisc permanentemente por meio da sua ferramenta de gerenciamento de configuração de rede.
Substitua <$DEV> pelo nome real da interface de rede (por exemplo, eth0).
sudo tc qdisc add dev <$DEV> root fq
Verifique se o qdisc fq está ativo na interface.
tc qdisc show dev <$DEV>
Saída esperada (os valores exatos podem variar):
qdisc fq 8001: root refcnt 2 limit 10000p flow_limit 100p ...
Atualize o kernel
A atualização para a versão mais recente do kernel do Alibaba Cloud Linux 2 resolve esse problema definitivamente.
Atualizações de kernel podem causar problemas de compatibilidade e estabilidade. Consulte as notas de versão do Alibaba Cloud Linux 2 e teste em um ambiente fora de produção antes de prosseguir.
A reinicialização da instância interrompe temporariamente seu funcionamento, o que pode afetar serviços em execução e causar perda de dados. Faça backup dos dados críticos antes de continuar e agende a reinicialização para horários de menor movimento.
-
Atualize para a versão mais recente do kernel.
sudo yum update kernel -
Reinicie a instância para que o novo kernel entre em vigor.
sudo reboot -
Após a reinicialização da instância, verifique a versão do kernel.
uname -rConfirme se a saída mostra uma versão do kernel posterior a
kernel-4.19.48-14.al7.