Descrição do problema
Podem ocorrer perdas de pacotes ocasionais ao conectar a aplicações em uma instância ECS. Uma investigação revela que a rede externa da instância ECS está normal, mas os logs do kernel (dmesg) contêm a mensagem de erro kernel: nf_conntrack: table full, dropping packet. Esse problema afeta instâncias ECS com as seguintes características:
Imagem:
aliyun-2.1903-x64-20G-alibase-20190327.vhdou posteriorKernel:
kernel-4.19.24-9.al7ou posterior
Causa
nf_conntrack é um módulo do kernel do Linux que rastreia entradas de conexão para Network Address Translation (NAT). O módulo nf_conntrack armazena conexões estabelecidas em uma tabela hash. Quando essa tabela hash fica cheia, novas conexões disparam o erro nf_conntrack: table full, dropping packet. Os principais parâmetros do módulo nf_conntrack incluem:
nf_conntrack_buckets: o tamanho da tabela hash de rastreamento de conexões. Especifique esse valor ao carregar o módulo ou modifique-o com o comandosysctl. Para sistemas com 4 GB ou mais de memória, o valor padrão é 65536.nf_conntrack_max: o número máximo de conexões que o módulonf_conntrackpode rastrear. Para sistemas com 4 GB ou mais de memória, o valor padrão é 262144. Esse valor padrão pode ser insuficiente para servidores que lidam com muitas conexões.nf_conntrack_tcp_timeout_time_wait: o tempo que onf_conntrackmantém a entrada de rastreamento de uma conexão TCP no estadoTIME_WAIT. O valor padrão é 120s.
Soluções
Escolha a solução mais adequada ao seu caso de uso.
Solução 1: Ajustar os parâmetros do nf_conntrack
Determine o número máximo de conexões que a sua aplicação pode exigir e execute os seguintes comandos para ajustar os parâmetros do módulo nf_conntrack.
sysctl -w net.netfilter.nf_conntrack_max=1503232
sysctl -w net.netfilter.nf_conntrack_buckets=375808 # This option cannot be modified during runtime if the kernel version is not 4.19.
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=60Os valores dos parâmetros nesses comandos são exemplos. Ajuste-os de acordo com a carga de trabalho real e os requisitos do seu negócio. Antes de fazer alterações, crie um snapshot ou faça backup dos arquivos importantes.
Revise as seguintes recomendações para configuração dos parâmetros:
Se a carga de trabalho envolve um grande número de conexões simultâneas e de curta duração, aumente os valores de
nf_conntrack_maxenf_conntrack_buckets. Isso evita que a tabela hash donf_conntrackfique cheia. Recomenda-se definir o valor denf_conntrack_maxcomo quatro vezes o valor denf_conntrack_buckets.Ajuste os parâmetros
nf_conntrack_bucketsenf_conntrack_maxjuntos. Aumentar apenasnf_conntrack_maxpode tornar as listas encadeadas na tabela hash longas demais, o que reduz a eficiência de busca. Alterar apenasnf_conntrack_bucketsnão resolve o problema.Antes de ajustar o parâmetro
nf_conntrack_tcp_timeout_time_wait, certifique-se de entender sua finalidade e efeitos potenciais. Ajuste esse parâmetro com cautela, com base no caso de uso da aplicação e nos resultados do monitoramento de desempenho. Os exemplos a seguir servem como referência para diferentes cenários:Para serviços de alta concorrência que lidam com muitas conexões de curta duração, como um servidor web, considere definir
nf_conntrack_tcp_timeout_time_waitcom uma duração mais curta, como 30 ou 60 segundos. Isso limpa as entradas de rastreamento de conexão mais rapidamente, liberando capacidade para novas conexões. No entanto, certifique-se de que a aplicação tolera uma pequena quantidade de retransmissão de dados ou latência.Se a aplicação exige integridade de dados extremamente alta, como um sistema de negociação financeira, é mais seguro manter o valor padrão de
nf_conntrack_tcp_timeout_time_wait. Isso ajuda a garantir que todos os pacotes de dados sejam entregues corretamente.Em ambientes com latência de rede alta ou instável, um valor mais curto para
nf_conntrack_tcp_timeout_time_waitpode aumentar o risco de perda de dados. Recomenda-se uma configuração mais conservadora.
Solução 2: Filtrar conexões não rastreadas com regras iptables
Adicione regras iptables com o alvo -j NOTRACK para impedir que conexões específicas sejam rastreadas. As conexões que correspondem a essas regras não são adicionadas à tabela de rastreamento, o que evita que ela fique cheia.
sudo iptables -t raw -A PREROUTING -p udp -j NOTRACK
sudo iptables -t raw -A PREROUTING -p tcp --dport 22 -j NOTRACKOs comandos de exemplo desativam o rastreamento de conexão para todo o tráfego UDP e para o tráfego TCP na porta 22. Essas regras são exemplos. Configure-as de acordo com os requisitos e o ambiente específicos.