Este tópico descreve os parâmetros de rede comuns do kernel Linux e fornece soluções para problemas relacionados.
Ferramenta de diagnóstico autônomo
A ferramenta de diagnóstico autônomo da Alibaba Cloud ajuda você a verificar rapidamente a configuração dos parâmetros do kernel e fornece um relatório de diagnóstico detalhado.
Clique em to open the Diagnostics page and selecione the target region.
O relatório de diagnóstico pode indicar uma anomalia como Inbound rules for common ports are not configured in the security group. Especificamente, o tráfego de entrada para o protocolo ICMP na porta -1 não é permitido, o que impede a instância de responder a solicitações PING. Para corrigir isso, modifique as regras do grupo de segurança para permitir o tráfego na porta correspondente.
Caso a ferramenta de diagnóstico autônomo não identifique seu problema, siga as etapas abaixo para realizar a solução de problemas manualmente.
Visualize e modifique parâmetros do kernel
Observações de uso
Antes de modificar os parâmetros do kernel, observe o seguinte:
Modifique os parâmetros do kernel apenas com base em requisitos específicos e com dados de suporte. Evite ajustes arbitrários.
Compreenda a finalidade de cada parâmetro. Os parâmetros do kernel podem variar dependendo do ambiente e da versão. Para mais informações, consulte Parâmetros comuns do kernel Linux.
Faça backup dos dados importantes na sua instância ECS. Para mais informações, consulte Criar um snapshot.
Modifique parâmetros
É possível usar tanto /proc/sys/ quanto /etc/sysctl.conf para modificar parâmetros do kernel enquanto uma instância está em execução. As diferenças são as seguintes:
O diretório
/proc/sys/é um sistema de arquivos virtual que fornece acesso aos parâmetros do kernel. O subdiretórionetcontém todos os parâmetros de rede do kernel habilitados para o sistema atual. Você pode modificar esses parâmetros em tempo de execução, mas as alterações não persistem após a reinicialização da instância. Este método é geralmente usado para testar alterações temporariamente.O arquivo
/etc/sysctl.confé um arquivo de configuração. Modifique o arquivo/etc/sysctl.confpara alterar os valores padrão dos parâmetros do kernel. As alterações persistem após a reinicialização da instância.
Os arquivos no diretório /proc/sys/ correspondem aos nomes dos parâmetros no arquivo /etc/sysctl.conf. Por exemplo, o parâmetro net.ipv4.tcp_tw_recycle corresponde ao arquivo /proc/sys/net/ipv4/tcp_tw_recycle, e o conteúdo do arquivo é o valor do parâmetro.
A configuração tcp_tw_recycle, que inclui a definição net.ipv4.tcp_tw_recycle no sysctl.conf, foi removida do Linux a partir da versão 4.12 do kernel. Use o parâmetro net.ipv4.tcp_tw_recycle apenas se o sistema estiver executando uma versão do kernel anterior à 4.12.
Usando /proc/sys/
-
Conecte-se à instância ECS Linux.
Para mais informações, consulte Visão geral dos métodos de conexão para instâncias ECS.
-
Use o comando
catpara visualizar o conteúdo do arquivo correspondente.Por exemplo, execute o seguinte comando para visualizar o valor de
net.ipv4.tcp_tw_recycle:cat /proc/sys/net/ipv4/tcp_tw_recycle -
Use o comando
echopara modificar o parâmetro do kernel.Por exemplo, execute o seguinte comando para alterar o valor de
net.ipv4.tcp_tw_recyclepara 0:echo "0" > /proc/sys/net/ipv4/tcp_tw_recycle
Usando /etc/sysctl.conf
-
Conecte-se à instância ECS Linux.
Para mais informações, consulte Visão geral dos métodos de conexão para instâncias ECS.
-
Execute o seguinte comando para visualizar todos os parâmetros atualmente em vigor:
sysctl -aUma amostra parcial da saída é mostrada abaixo:
net.ipv4.tcp_app_win = 31 net.ipv4.tcp_adv_win_scale = 2 net.ipv4.tcp_tw_reuse = 0 net.ipv4.tcp_frto = 2 net.ipv4.tcp_frto_response = 0 net.ipv4.tcp_low_latency = 0 net.ipv4.tcp_no_metrics_save = 0 net.ipv4.tcp_moderate_rcvbuf = 1 net.ipv4.tcp_tso_win_divisor = 3 net.ipv4.tcp_congestion_control = cubic net.ipv4.tcp_abc = 0 net.ipv4.tcp_mtu_probing = 0 net.ipv4.tcp_base_mss = 512 net.ipv4.tcp_workaround_signed_windows = 0 net.ipv4.tcp_challenge_ack_limit = 1000 net.ipv4.tcp_limit_output_bytes = 262144 net.ipv4.tcp_dma_copybreak = 4096 net.ipv4.tcp_slow_start_after_idle = 1 net.ipv4.cipso_cache_enable = 1 net.ipv4.cipso_cache_bucket_size = 10 net.ipv4.cipso_rbm_optfmt = 0 net.ipv4.cipso_rbm_strictvalid = 1 -
Modifique os parâmetros do kernel.
-
Para fazer uma alteração temporária:
/sbin/sysctl -w kernel.parameter="[value]"NotaSubstitua
kernel.parameterpelo nome do parâmetro do kernel e[value]pelo valor desejado. Por exemplo, execute o comandosysctl -w net.ipv4.tcp_tw_recycle="0"para alterar o valor do parâmetro do kernelnet.ipv4.tcp_tw_recyclepara 0. -
Para fazer uma alteração permanente:
-
Execute o seguinte comando para abrir o arquivo de configuração
/etc/sysctl.conf:vim /etc/sysctl.conf Pressione a tecla
ipara entrar no modo de edição.-
Modifique os parâmetros do kernel conforme necessário.
O exemplo a seguir mostra o formato necessário:
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 Pressione a tecla
Esc, insira:wqe pressione Enter para salve o arquivo e sair.-
Execute o seguinte comando para aplicar as alterações:
/sbin/sysctl -p
-
-
Problemas comuns de parâmetros de rede
Por que a mensagem de erro "Time wait bucket table overflow" aparece no log /var/log/messages?
Por que há muitas conexões TCP no estado FIN_WAIT2 em uma instância ECS Linux?
Por que há muitas conexões TCP no estado CLOSE_WAIT em uma instância ECS Linux?
Falha na conexão remota: "nf_conntrack: table full, dropping packet"
Sintomas
Não é possível conectar-se remotamente a uma instância ECS. O ping para a instância de destino resulta em perda de pacotes ou falha. A seguinte mensagem de erro aparece frequentemente no log do sistema /var/log/message:
Feb 6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.
Feb 6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.
Feb 6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.
Feb 6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.
Causa
ip_conntrack é um módulo Linux que rastreia entradas de conexão para NAT. O módulo usa uma tabela hash para registrar entradas de established connection TCP. Quando essa tabela hash fica cheia, os pacotes para novas conexões são descartados, causando o erro nf_conntrack: table full, dropping packet.
O sistema Linux aloca um espaço de memória para manter cada conexão TCP. O tamanho desse espaço é determinado pelos parâmetros nf_conntrack_buckets e nf_conntrack_max. O valor padrão deste último é quatro vezes o valor do primeiro. Portanto, recomendamos aumentar o valor do parâmetro nf_conntrack_max.
Manter conexões do sistema consome uma grande quantidade de memória. Recomendamos aumentar o valor do parâmetro nf_conntrack_max apenas quando o sistema estiver ocioso e tiver memória suficiente.
Solução
-
Conecte-se à instância usando VNC.
Para mais informações, consulte Conectar-se a uma instância Linux usando autenticação por senha.
-
Modifique o valor do parâmetro
nf_conntrack_max.-
Execute o seguinte comando para abrir o arquivo
/etc/sysctl.conf:vi /etc/sysctl.conf Pressione a tecla
ipara entrar no modo de edição.-
Modifique o valor do parâmetro
nf_conntrack_max.Por exemplo, altere o número máximo de entradas da tabela hash para
655350:net.netfilter.nf_conntrack_max = 655350 Pressione a tecla
Esc, insira:wqe pressione Enter para salve o arquivo e sair.
-
-
Modifique o valor do parâmetro de timeout
nf_conntrack_tcp_timeout_established.Por exemplo, altere o valor do parâmetro de timeout para 1.200. O timeout padrão é de 432.000 segundos.
net.netfilter.nf_conntrack_tcp_timeout_established = 1200 -
Execute o seguinte comando para aplicar as alterações:
sysctl -p
Erro "Time wait bucket table overflow"
Sintomas
A mensagem de erro "kernel: TCP: time wait bucket table overflow" aparece frequentemente no /var/log/messages de uma instância ECS Linux.
Feb 18 12:28:38 i-*** kernel: TCP: time wait bucket table overflow
Feb 18 12:28:44 i-*** kernel: printk: 227 messages suppressed.
Feb 18 12:28:44 i-*** kernel: TCP: time wait bucket table overflow
Feb 18 12:28:52 i-*** kernel: printk: 121 messages suppressed.
Feb 18 12:28:52 i-*** kernel: TCP: time wait bucket table overflow
Feb 18 12:28:53 i-*** kernel: printk: 351 messages suppressed.
Feb 18 12:28:53 i-*** kernel: TCP: time wait bucket table overflow
Feb 18 12:28:59 i-*** kernel: printk: 319 messages suppressed.
Causa
O parâmetro net.ipv4.tcp_max_tw_buckets controla o número de conexões no estado TIME_WAIT que o kernel pode gerenciar. Quando o número total de conexões no estado TIME_WAIT e conexões prestes a transicionar para esse estado excede o valor do parâmetro net.ipv4.tcp_max_tw_buckets, a mensagem de erro "kernel: TCP: time wait bucket table overflow" aparece no /var/log/messages. O kernel então encerra as conexões TCP excedentes.
Solução
Aumente o valor do parâmetro net.ipv4.tcp_max_tw_buckets conforme necessário. Além disso, recomendamos otimizar as conexões TCP no nível da aplicação. Este tópico descreve como modificar o valor do parâmetro net.ipv4.tcp_max_tw_buckets.
-
Conecte-se à instância usando VNC.
Para mais informações, consulte Conectar-se a uma instância Linux usando autenticação por senha.
-
Execute o seguinte comando para verifique o número de conexões TCP:
netstat -antp | awk 'NR>2 {print $6}' | sort | uniq -cA saída a seguir indica que 6.300 conexões estão no estado TIME_WAIT:
6300 TIME_WAIT 40 LISTEN 20 ESTABLISHED 20 CONNECTED -
Execute o seguinte comando para visualize o valor do parâmetro
net.ipv4.tcp_max_tw_buckets:cat /etc/sysctl.conf | grep net.ipv4.tcp_max_tw_bucketsA saída indica que o valor do parâmetro
net.ipv4.tcp_max_tw_bucketsé 20000.net.ipv4.tcp_max_tw_buckets = 20000 -
Modifique o valor do parâmetro
net.ipv4.tcp_max_tw_buckets.-
Execute o seguinte comando para abrir o arquivo
/etc/sysctl.conf:vi /etc/sysctl.conf Pressione a tecla
ipara entrar no modo de edição.-
Modifique o valor do parâmetro
net.ipv4.tcp_max_tw_buckets.Por exemplo, altere o valor do parâmetro
net.ipv4.tcp_max_tw_bucketspara65535:net.ipv4.tcp_max_tw_buckets = 65535 Pressione a tecla
Esc, insira:wqe pressione Enter para salve o arquivo e sair.
-
-
Execute o seguinte comando para aplicar as alterações:
sysctl -p
Alto número de conexões no estado FIN_WAIT2
Sintomas
Um grande número de conexões TCP na instância ECS Linux está no estado FIN_WAIT2.
Causa
Esse problema pode ocorrer pelos seguintes motivos:
Em um serviço HTTP, o servidor pode fechar proativamente uma conexão por um motivo específico, como timeout de KEEPALIVE. Quando o servidor fecha a conexão, ela entra no estado FIN_WAIT2.
A pilha de protocolos TCP/IP suporta conexões semiabertas. Diferentemente do estado TIME_WAIT, o estado FIN_WAIT2 não possui timeout. Se o cliente não fechar sua extremidade da conexão, ela permanecerá no estado FIN_WAIT2 até que o sistema seja reiniciado. Um número crescente de conexões FIN_WAIT2 pode causar falha no kernel.
Solução
Diminua o valor de net.ipv4.tcp_fin_timeout para fechar conexões TCP no estado FIN_WAIT2 mais rapidamente.
-
Conecte-se à instância usando VNC.
Para mais informações, consulte Conectar-se a uma instância Linux usando autenticação por senha.
-
Modifique o valor do parâmetro
net.ipv4.tcp_fin_timeout.-
Execute o seguinte comando para abrir o arquivo
/etc/sysctl.conf:vi /etc/sysctl.conf Pressione a tecla
ipara entrar no modo de edição.-
Modifique o valor do parâmetro
net.ipv4.tcp_fin_timeout.Por exemplo, altere o valor do parâmetro
net.ipv4.tcp_fin_timeoutpara 10:net.ipv4.tcp_fin_timeout = 10 Pressione a tecla
Esc, insira:wqe pressione Enter para salve o arquivo e sair.
-
-
Execute o seguinte comando para aplicar as alterações:
sysctl -p
Alto número de conexões no estado CLOSE_WAIT
Sintomas
Um grande número de conexões TCP na instância ECS Linux está no estado CLOSE_WAIT.
Causa
Esse problema pode ocorrer quando o número de conexões no estado CLOSE_WAIT excede o intervalo normal.
O TCP usa um handshake de quatro vias para encerrar uma conexão. Qualquer extremidade de uma conexão TCP pode iniciar a solicitação de fechamento. Se o par remoto iniciar o fechamento, mas a aplicação local não fechar sua extremidade do socket, a conexão entrará no estado CLOSE_WAIT. Embora seja um estado de fechamento parcial, a conexão não pode mais ser usada para comunicação e deve ser encerrada prontamente.
Solução
Recomendamos investigar a lógica da sua aplicação para garantir que ela lide corretamente com conexões fechadas pelo par remoto. A aplicação deve fechar seu socket prontamente e realizar verificações.
-
Conecte-se à instância ECS.
Para mais informações, consulte Visão geral dos métodos de conexão para instâncias ECS.
-
Verifique e feche conexões TCP que estejam no estado CLOSE_WAIT dentro da sua aplicação.
As funções de leitura e escrita na maioria das linguagens de programação podem detectar uma conexão no estado CLOSE_WAIT. Os exemplos a seguir mostram como fechar uma conexão em Java e C:
-
Java
Use o método
read()para verifique o fim do fluxo. Quando o método retorna-1, indica que o par fechou sua extremidade.Chame o método
close()para fechar a conexão.
-
C
Verifique o valor de retorno da chamada de sistema
read().Se o valor de retorno for 0, o par fechou a conexão. Agora você pode fechar o socket.
Se o valor de retorno for menor que 0, verifique o
errno. Se o erro não forEAGAINouEWOULDBLOCK, ocorreu um erro e você deve fechar o socket.
-
Falha de acesso após configuração de NAT
Sintomas
Após a configuração de NAT no lado do cliente, este não consegue acessar instâncias ECS ou ApsaraDB RDS do lado do servidor. Isso inclui instâncias ECS em uma VPC configuradas com SNAT.
Causa
Esse problema pode ocorrer se os parâmetros net.ipv4.tcp_tw_recycle e net.ipv4.tcp_timestamps estiverem definidos como 1 no servidor.
Quando os parâmetros do kernel do servidor net.ipv4.tcp_tw_recycle e net.ipv4.tcp_timestamps estão ambos habilitados (definidos como 1), o servidor verifica o timestamp de cada pacote TCP recebido. Se o timestamp de um novo pacote não for maior que o último timestamp registrado daquele endpoint, o servidor descarta o pacote.
Solução
Escolha a solução com base no produto de nuvem do lado do servidor.
Se o servidor remoto for uma instância ECS, defina os parâmetros
net.ipv4.tcp_tw_recycleenet.ipv4.tcp_timestampscomo 0 na instância ECS.Se o servidor remoto for uma instância ApsaraDB RDS, não é possível modificar diretamente seus parâmetros do kernel. Em vez disso, defina os parâmetros
net.ipv4.tcp_tw_recycleenet.ipv4.tcp_timestampscomo 0 na máquina cliente.
-
Conecte-se à instância usando VNC.
Para mais informações, consulte Conectar-se a uma instância Linux usando autenticação por senha.
-
Altere os valores dos parâmetros
net.ipv4.tcp_tw_recycleenet.ipv4.tcp_timestampspara 0.-
Execute o seguinte comando para abrir o arquivo
/etc/sysctl.conf:vi /etc/sysctl.conf Pressione a tecla
ipara entrar no modo de edição.-
Altere os valores dos parâmetros
net.ipv4.tcp_tw_recycleenet.ipv4.tcp_timestampspara 0.net.ipv4.tcp_tw_recycle=0 net.ipv4.tcp_timestamps=0 Pressione a tecla
Esc, insira:wqe pressione Enter para salve o arquivo e sair.
-
-
Execute o seguinte comando para aplicar as alterações:
sysctl -p
Parâmetros comuns do kernel Linux
|
Parâmetro |
Descrição |
|
net.core.rmem_default |
Tamanho padrão do buffer de recebimento do socket, em bytes. |
|
net.core.rmem_max |
Tamanho máximo do buffer de recebimento do socket, em bytes. |
|
net.core.wmem_default |
Tamanho padrão do buffer de envio do socket, em bytes. |
|
net.core.wmem_max |
Tamanho máximo do buffer de envio do socket, em bytes. |
|
net.core.netdev_max_backlog |
Define o número máximo de pacotes que podem ser enfileirados na fila de entrada da interface de rede. Essa fila retém pacotes quando a interface de rede os recebe mais rápido do que o kernel consegue processá-los. |
|
net.core.somaxconn |
Parâmetro global que define o comprimento máximo da fila de escuta para cada porta. Este parâmetro está relacionado ao |
|
net.core.optmem_max |
Especifica o tamanho máximo do buffer auxiliar permitido por socket. |
|
net.ipv4.tcp_mem |
Determina como a pilha TCP gerencia o uso de memória. Cada valor está em unidades de páginas de memória (geralmente 4 KB).
|
|
net.ipv4.tcp_rmem |
Define a memória reservada para buffers de recebimento TCP.
|
|
net.ipv4.tcp_wmem |
Define a memória reservada para buffers de envio TCP.
|
|
net.ipv4.tcp_keepalive_time |
Intervalo em segundos entre sondas keepalive TCP enviadas para verifique se uma conexão ainda está ativa. |
|
net.ipv4.tcp_keepalive_intvl |
Intervalo em segundos entre tentativas caso uma sonda keepalive não seja confirmada. |
|
net.ipv4.tcp_keepalive_probes |
Número máximo de sondas keepalive a serem enviadas antes que uma conexão TCP seja considerada morta. |
|
net.ipv4.tcp_sack |
Habilita o Selective Acknowledgment (SACK). O valor 1 ative o recurso. Ele melhora o desempenho permitindo que o receptor confirme pacotes fora de ordem, de modo que o remetente retransmita apenas os segmentos ausentes. Esta opção é recomendada para comunicação em redes WAN, mas aumenta o uso da CPU. |
|
net.ipv4.tcp_timestamps |
Habilita timestamps TCP, que adicionam 12 bytes ao cabeçalho TCP. Os timestamps permitem cálculos de Round-Trip Time (RTT) mais precisos do que o mecanismo de timeout de retransmissão (consulte a RFC 1323). Esta opção deve estar habilitada para melhor desempenho. |
|
net.ipv4.tcp_window_scaling |
Habilita o dimensionamento de janela conforme definido na RFC 1323. Defina como 1 para suportar janelas TCP maiores que 64 KB, até um máximo de 1 GB. Esta opção só entra em vigor se ambas as extremidades da conexão TCP a habilitarem. |
|
net.ipv4.tcp_syncookies |
Este parâmetro especifica se deve habilitar TCP SYN cookies (
|
|
net.ipv4.tcp_tw_reuse |
Permite reutilizar sockets no estado TIME-WAIT para novas conexões TCP. |
|
net.ipv4.tcp_tw_recycle |
Habilita a reciclagem rápida de sockets TIME-WAIT. |
|
net.ipv4.tcp_fin_timeout |
Tempo em segundos que uma conexão permanece no estado FIN-WAIT-2 na extremidade local após o fechamento de um socket. A extremidade remota pode desconectar, nunca fechar a conexão ou encerrar inesperadamente. |
|
net.ipv4.ip_local_port_range |
Especifica o intervalo de números de porta locais que os protocolos TCP/UDP podem usar. |
|
net.ipv4.tcp_max_syn_backlog |
Determina o número máximo de solicitações de conexão enfileiradas no estado Uma conexão está no estado |
|
net.ipv4.tcp_westwood |
Habilita o algoritmo de controle de congestionamento Westwood+ no lado do remetente. Ele otimiza a utilização da largura de banda mantendo uma estimativa do throughput disponível. Esta opção é recomendada para comunicação WAN. |
|
net.ipv4.tcp_bic |
Habilita o controle Binary Increase Congestion (BIC) para redes rápidas e de longa distância. Isso permite melhor utilização de links com velocidade gigabit. Esta opção é recomendada para comunicação WAN. |
|
net.ipv4.tcp_max_tw_buckets |
Define o número máximo de sockets no estado TIME_WAIT. Se esse limite for excedido, eles serão fechados imediatamente. O valor padrão depende da memória da instância, com um máximo de 262.144. |
|
net.ipv4.tcp_synack_retries |
Especifica o número de vezes para retransmitir um pacote SYN+ACK para uma conexão no estado |
|
net.ipv4.tcp_abort_on_overflow |
Se definido como 1, o sistema envia um pacote de reset (RST) para encerrar conexões quando a aplicação não consegue processar um alto volume de solicitações recebidas em pouco tempo. Recomendamos otimizar o desempenho da aplicação em vez de simplesmente resetar conexões. O valor padrão é 0. |
|
net.ipv4.route.max_size |
Tamanho máximo do cache de roteamento do kernel. |
|
net.ipv4.ip_forward |
Habilita o encaminhamento de pacotes entre interfaces. |
|
net.ipv4.ip_default_ttl |
Valor padrão de Time To Live (TTL) para pacotes de saída. |
|
net.netfilter.nf_conntrack_tcp_timeout_established |
Timeout em segundos para conexões TCP estabelecidas que não têm atividade. |
|
net.netfilter.nf_conntrack_max |
Número máximo de entradas na tabela de rastreamento de conexões. |