Ubuntu 14.04 TCP estabeleceu entradas de tabela de hash

1

Um pouco de fundo

Estou executando dois servidores com alto tráfego, um com o Ubuntu 12.04 (linux 3.2.0-69-generic) e um com o Ubuntu 14.04 (linux 3.13.0-52-generic). Agora estou tentando proteger os dois. Ambos têm recursos de hardware muito semelhantes (mesmo número de CPUS, mas o 12.04 possui apenas 8 GB de RAM quando o 14.04 tem 16 GB).

Eu queria ativar o firewall ufw, mas tive alguns problemas com a tabela nf_conntrack ficando cheia. Pacotes foram descartados basicamente.

Encontrei uma solução para eles diminuindo os tempos limite e aumentando o tamanho da tabela, bem como o número de intervalos. Isso é:

net.netfilter.nf_conntrack_tcp_timeout_established = 600
net.netfilter.nf_conntrack_max = 196608
net.netfilter.nf_conntrack_buckets = 24576

Esses valores são atualizados corretamente e sobrevivem à reinicialização. (Veja este blog ) Eu também vejo o conntrack_count sendo gerado bem acima do valor padrão, então tenho certeza que isso está funcionando em ambos os servidores. Os valores ficam bem abaixo dos limites, então tenho certeza que está bem.

O problema

O servidor 12.04 funciona bem sob carga alta, mas o 14.04 continua perdendo pacotes, criando tempos limite do cliente. Agora, na inicialização em 14.04, posso ver essa linha em kern.log:

TCP established hash table entries: 131072 (order: 8, 1048576 bytes)

Enquanto em 12.04, é:

TCP established hash table entries: 524288 (order: 11, 8388608 bytes)

Eu suspeito que seja por isso que meu servidor está descartando pacotes, já que essa tabela pode ser pequena demais em relação ao valor do tráfego em 14.04.

Então, tentei encontrar uma maneira de definir esse tamanho e encontrei o parâmetro thash_entries veja aqui para explicação). No entanto, não posso configurá-lo com sysctl.

Então, aqui estão minhas perguntas:

  1. Essa tabela de conexão tcp é realmente a fonte do meu problema? ou devo procurar em outro lugar?
  2. Se for, como posso configurá-lo e fazer com que ele sobreviva a uma reinicialização?

Agradecemos antecipadamente por qualquer ajuda e não hesite em perguntar se você precisa de mais ajuda.

P.S. Eu sou mais um desenvolvedor do que um especialista em sistemas, então gostaria de receber qualquer resposta detalhada:)

    
por Arnaud Potier 02.10.2015 / 15:53

1 resposta

1

Ajustar o kernel do Linux para alta taxa de transferência de rede é uma arte baseada no equilíbrio.

Aumentar a Tabela do Controlador de Conexões é bom, mas significa que mais soquetes são potencialmente usados, o que significa que o sistema precisa de mais Descritores de Arquivo, e a roda continua ...

No seu caso, eu começaria com as seguintes configurações do kernel:

net.core.somaxconn

e

fs.file-max

O primeiro determina a quantidade de soquetes abertos que o kernel irá sustentar. O segundo é usado para definir a quantidade de descritores de arquivo usados que serão suportados pelo kernel.

Depois, há o backlog SYN que pode ser melhorado ainda mais.

net.ipv4.tcp_max_syn_backlog

Ajustará a quantidade de conexão que pode aguardar um ACK do seu servidor.

net.ipv4.tcp_syncookies

Para que o SYN Backlog funcione, você precisa ativar os cookies TCP SYN.

Finalmente, também há alguns ajustes que podem ser feitos, como a ativação da reutilização da conexão TIME_WAIT.

net.ipv4.tcp_tw_reuse

Isso pode reduzir potencialmente a quantidade de "novos" soquetes que seriam abertos quando você receber um pico.

Essa é apenas a ponta do iceberg, minha experiência com o sistema Linux / Unix de alto volume é que você irá ajustá-lo por alguns meses antes de obter o equilíbrio certo.

Verifique os erros em /var/log/kern.log e /var/log/messages para ajudar a solucionar problemas adicionais.

Kernel de ajuste

Guia de administração de computação de alto rendimento

    
por 02.10.2015 / 17:30