Eu administro um site bastante ocupado e, durante as horas de pico, vejo mais de 10.000 conexões abertas com meu servidor de banco de dados no meu servidor da Web quando um comando netstat é executado. 99% das conexões estão no TIME_WAIT
estado.
Aprendi sobre esta variável mysql: wait_timeout
http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_wait_timeout hoje. O meu ainda está definido nos 28.800 segundos padrão.
A redução desse valor é segura?
Normalmente, minhas consultas não demoram mais de um segundo. Portanto, parece bobagem manter uma conexão aberta por 480 minutos.
Também ouvi falar sobre o uso em mysql_pconnect
vez de mysql_connect
, mas não tenho lido nada além de histórias de horror sobre isso, então acho que vou ficar longe disso.
wait_timeout
causar o fechamento de uma conexão quando o software espera que ele permaneça aberto.Respostas:
Reduzir o valor é bastante trivial sem uma reinicialização do mysql
Digamos que você queira reduzir o tempo limite para 30 segundos
Primeiro, adicione isso ao my.cnf
Então, você pode fazer algo assim
Todas as conexões de banco de dados após isso expirarão em 30 segundos
ATENÇÃO
Certifique-se de usar explicitamente o mysql_close. Não confio no Apache como a maioria dos desenvolvedores. Caso contrário, às vezes, há uma condição de corrida em que o Apache fecha uma conexão com o banco de dados, mas não informa ao mysqld e o mysqld mantém essa conexão aberta até o tempo limite. Pior ainda, você pode ver TIME_WAITs com mais frequência. Escolha seus valores de tempo limite com sabedoria.
UPDATE 2012-11-12 10:10 EDT
EMBARGO
Depois de aplicar minhas sugestões postadas, crie um script chamado
/root/show_mysql_netstat.sh
com as seguintes linhas:Quando você executa isso, você deve ver algo assim:
Se você ainda vir muito mysql
TIME_WAITs
para qualquer servidor web, seguem duas etapas de escalação a serem seguidas:ESCALAÇÃO # 1
Efetue login no servidor da web ofensivo e reinicie o apache da seguinte maneira:
Se necessário, faça isso com todos os servidores web
ESCALAÇÃO # 2
Você pode forçar o sistema operacional a eliminar TIME_WAITs para mysql ou qualquer outro aplicativo com o seguinte:
Isso fará com que TIME_WAITs atinja o tempo limite em 1 segundo.
Para dar crédito onde o crédito é devido ...
TIME_WAIT
surge.fonte
Se você está recebendo muitas conexões TIME_WAIT no MySQL Server, isso significa que o servidor MySQL está fechando a conexão. O caso mais provável nesse caso seria que um host ou vários hosts entrassem em uma lista de bloqueios. Você pode limpar isso executando:
Para obter uma lista do número de conexões que você tem por execução de IP:
Você também pode confirmar que isso está acontecendo, indo para um de seus clientes que está com problemas para conectar e telnet à porta 3306. Ele mostrará uma mensagem com algo como:
fonte
Se você tiver muitas conexões TIME_WAIT com o servidor MySQL, significa que o código está executando muitas consultas no seu banco de dados e abrindo / fechando uma conexão para cada consulta.
Nesse caso, você deve usar conectividade persistente ao seu servidor de banco de dados, usando a extensão MySQLi.
http://php.net/manual/en/mysqli.persistconns.php
Se você não pode usar o MySQLi, deve usar o parâmetro thread_cache_size na sua configuração do MySQL.
fonte