servidor mysql, abra conexões 'inoperantes'

2

Minha pergunta básica é que tipo de impacto isso tem no servidor?

Digamos, por exemplo, que exista um programa mais antigo na minha empresa que abra conexões com um servidor de banco de dados mysql em uma taxa alta (tudo o que eles fazem com o aplicativo basicamente abre conexões de servidor). No entanto, este aplicativo não foi projetado para descartar as conexões depois que elas foram criadas. Na maior parte do tempo, as conexões permanecem abertas, mas nunca são usadas novamente, abra conexões "mortas", eu acho que você poderia dizer.

Eles apenas permanecem conectados até que o servidor os exceda ou até que um administrador entre e remova as conexões adormecidas manualmente. Eu estou supondo que isso poderia ser responsável por, por vezes, não conseguir conectar erros, etc, que recebemos de outros sistemas que tentam acessar o banco de dados mysql? (limite de conexões atingido)

Isso também pode atrasar o servidor? Curioso o que tudo isso poderia exatamente causar.

    
por Jeff 05.02.2011 / 22:52

4 respostas

3

Você pode jogar alguns jogos com os valores de tempo limite no MySQL.

Por exemplo, o valor padrão para ' wait_timeout ' e ' interactive_timeout ' é 28800 (ou seja, 8 horas)

Você pode ver o que eles estão configurando ao executar isso:

SHOW VARIABLES LIKE 'interactive_timeout';<BR>
SHOW VARIABLES LIKE 'wait_timeout';

Se você quiser diminuir isso para, por exemplo, 1 minuto, uma reinicialização do MySQL não é necessária.

Execute estes como o usuário root:

SET GLOBAL interactive_timeout=60;<BR>
SET GLOBAL wait_timeout=60;

Isso garantirá que qualquer nova conexão com o MySQL seja interrompida em 60 segundos.

adicione essas linhas a /etc/my.cnf na seção [mysqld]

interactive_timeout=60
wait_timeout=60

É claro que é mais fácil reiniciar o mysql para remover as conexões restantes. Todas as conexões, daqui para frente, terminarão em 60 segundos.

Experimente-nos e deixe-nos saber!

    
por 06.02.2011 / 06:34
1

A menos que você esteja executando em um servidor realmente limitado, isso provavelmente não diminuirá nada. O aplicativo fazendo isso lentamente irá vazar mem embora até que o máximo de conexões seja atingido, mas duvido que seja muita memória.

O principal problema que você provavelmente enfrentará é aquele que você já notou, maximizando as conexões. Sua melhor opção é corrigir o programa para limpar depois de si mesmo. Se por algum motivo isso realmente não for uma opção, você pode colocar um limite de conexão da caixa que está rodando aquele aplicativo para que essa caixa não consiga abrir mais de X conexões para o servidor mysql para que ele não monopolize (eu não sei qual SO você está usando para saber se isso é possível, mas se for linux, seria uma regra simples do iptables).

    
por 05.02.2011 / 22:57
1

sim, interactive_timeout e wait_timeout. Enquanto o thread de limpeza no mysql continuar rodando, ele irá limpá-los

    
por 08.02.2011 / 21:03
1

Isso não causa problemas até que você fique sem conexões e os clientes legítimos não possam se conectar.

É claro que você precisa definir max_connections baixo o suficiente para não ficar sem memória ou espaço de endereço (o MySQL usa um thread por conexão). Você não deve executar o mysql em um sistema de 32 bits, mas se fizer isso, isso significa que você precisa (praticamente) ter max_connections < 1000.

Se o servidor de aplicativos não estiver conseguindo fechar as conexões, é provável que também esteja vazando recursos. Ter o servidor desativado irá corrigir o problema no final do mysql, mas provavelmente não liberará memória (etc) na outra ponta. O servidor de aplicativos defeituoso falhará eventualmente se for deixado desmarcado. Ele realmente precisa ser consertado.

Além disso, tenha muito cuidado ao definir tempos limites baixos, alguns aplicativos esperam que as conexões não excedam o tempo limite. O padrão é 8 horas, então alterá-lo para 1 minuto parece muito drástico.

    
por 20.02.2011 / 14:06

Tags