Ubuntu 14.04 TCP estabeleceu entradas de tabela hash

Ubuntu 14.04 TCP estabeleceu entradas de tabela hash

Um pouco de fundo

Estou executando dois servidores com alto tráfego, um com o Ubuntu 12.04 (linux 3.2.0-69-genérico) e outro com o Ubuntu 14.04 (linux 3.13.0-52-genérico). Agora estou tentando proteger ambos. Ambos possuem recursos de hardware muito semelhantes (mesmo número de CPUS, mas o 12.04 tem apenas 8 GB de RAM enquanto o 14.04 tem 16 GB).

Eu queria ativar o firewall ufw, mas tive alguns problemas com a tabela nf_conntrack ficando cheia. Os pacotes estavam sendo 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. Aquilo é:

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. (Vereste blog) Também vejo conntrack_count sendo aumentado bem acima do valor padrão, então tenho certeza de que isso está funcionando em ambos os servidores. Os valores ficam bem abaixo dos limites, então tenho certeza de que está tudo bem.

O problema

O servidor 12.04 funciona bem sob alta carga, mas o 14.04 continua descartando pacotes, criando tempos limite do cliente. Agora, na inicialização em 14.04, posso ver esta 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)

Suspeito que seja por isso que meu servidor está descartando pacotes, pois esta tabela pode ser muito pequena em relação à quantidade de tráfego em 14.04.

Então tentei procurar uma maneira de definir esse tamanho e encontrei o parâmetro thash_entriesVeja aquipara explicação). No entanto, não consigo configurá-lo com sysctl.

Então, aqui estão as minhas questões:

  1. Esta 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 fazê-lo sobreviver a uma reinicialização?

Agradecemos antecipadamente por qualquer ajuda e não hesite em me perguntar se precisar de mais ajuda.

PS: Sou mais um desenvolvedor do que um especialista em sistemas, então agradeceria qualquer resposta detalhada :)

Responder1

Ajustar o kernel do Linux para obter alto rendimento de rede é uma arte baseada no equilíbrio.

Aumentar a tabela do rastreador de conexão é bom, mas significa que mais soquetes são potencialmente usados, o que, por sua vez, significa que o sistema precisa de mais descritores de arquivos e a roda continua...

No seu caso, eu começaria com as seguintes configurações de 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 Arquivos usados ​​que serão suportados pelo kernel.

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

net.ipv4.tcp_max_syn_backlog

Irá definir a quantidade de conexão que pode ficar aguardando um ACK do seu servidor.

net.ipv4.tcp_syncookies

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

Finalmente, também há alguns ajustes que podem ser feitos, como ativar a 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ê recebesse um pico.

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

Certifique-se de verificar os erros /var/log/kern.loge /var/log/messagesajudar a solucionar problemas adicionais.

Kernel de ajuste

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

informação relacionada