Temos alguns sistemas de produção que foram recentemente convertidos em máquinas virtuais. Existe um aplicativo nosso que freqüentemente acessa um banco de dados MySQL e, para cada consulta, ele cria uma conexão, consulta e desconecta essa conexão.
Não é a maneira apropriada de consultar (eu sei), mas temos restrições que parece que não conseguimos contornar. Enfim, o problema é o seguinte: enquanto a máquina era um host físico, o programa funcionou bem. Depois de convertido em uma máquina virtual, percebemos problemas de conexão intermitentes com o banco de dados. Houve, em um ponto, mais de 24000 conexões de soquete no TIME_WAIT (no host físico, o máximo que vi foi 17000 - não é bom, mas não está causando problemas).
Gostaria que essas conexões fossem reutilizadas, para que não vejamos esse problema de conexão, e assim:
Questões:
É possível definir o valor de tcp_tw_reuse como 1? Quais são os perigos óbvios? Existe alguma razão para eu nunca fazer isso?
Além disso, existe outra maneira de obter o sistema (RHEL / CentOS) para impedir que tantas conexões entrem no TIME_WAIT ou que elas sejam reutilizadas?
Por fim, o que a alteração do tcp_tw_recycle faria e isso me ajudaria?
De antemão, obrigado!
Respostas:
Você pode reduzir o tempo de inatividade com segurança, mas pode ter problemas com conexões fechadas incorretamente em redes com perda ou instabilidade de pacotes. Eu não começaria a sintonizar em 1 segundo, começaria entre 15 e 30 e continuaria trabalhando.
Além disso, você realmente precisa corrigir seu aplicativo.
O RFC 1185 tem uma boa explicação na seção 3.2:
fonte
Isso não responde à sua pergunta (e está 18 meses atrasado), mas sugere outra maneira de tornar as portas de reutilização do seu aplicativo herdado:
Uma alternativa útil para definir
tcp_tw_reuse
(outcp_tw_recycle
) no sistema é inserir uma biblioteca compartilhada (usandoLD_PRELOAD
) no seu aplicativo; essa biblioteca pode permitir a reutilização da porta. Isso faz com que o seu aplicativo herdado permita a reutilização de portas sem forçar isso em todos os aplicativos do seu sistema (nenhuma modificação é necessária), limitando o impacto do seu ajuste. Por exemplo,Essa biblioteca compartilhada deve interceptar a
socket()
chamada, chamar o soquete real () e definir SO_REUSEADDR e / ou SO_REUSEPORT no soquete retornado. Veja http://libkeepalive.sourceforge.net para obter um exemplo de como fazer isso (isso ativa o keepalives, mas ativar o SO_REUSEPORT é muito semelhante). Se seu aplicativo legado mal-comportado usa IPv6, lembre-se de alterar linha 55 dolibkeepalive.c
depara
Se você estiver emperrado, envie-me um e-mail e eu escreverei o código e o enviarei para você.
fonte
Eu acho que é bom alterar esse valor para 1. Uma maneira mais apropriada pode ser usar o comando:
Não há perigos óbvios que eu conheça, mas uma rápida pesquisa no Google produz esse link que afirma
tcp_tw_reuse
ser a melhor alternativa do quetcp_tw_recycle
, mas deve ser usado com cautela independentemente.fonte
A conexão não pode ser reutilizada se eles estiverem no TIME WAIT. Se você não tiver perda de pacotes na rede entre o aplicativo e o MySQL, poderá diminuir o tempo limite.
No entanto, a melhor solução é usar conexões persistentes com o banco de dados e um pool de conexões.
fonte