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
[mysqld]
interactive_timeout=30
wait_timeout=30
Então, você pode fazer algo assim
mysql -uroot -ppassword -e"SET GLOBAL wait_timeout=30; SET GLOBAL interactive_timeout=30"
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:
netstat | grep mysql > /root/mysql_netstat.txt
cat /root/mysql_netstat.txt | awk '{print $5}' | sed 's/:/ /g' | awk '{print $2}' | sort -u > /root/mysql_netstat_iplist.txt
for IP in `cat /root/mysql_netstat_iplist.txt`
do
ESCOUNT=`cat /root/mysql_netstat.txt | grep ESTABLISHED | awk '{print $5}' | grep -c "${IP}"`
TWCOUNT=`cat /root/mysql_netstat.txt | grep TIME_WAIT | awk '{print $5}' | grep -c "${IP}"`
IPPAD=`echo "${IP}..................................." | cut -b -35`
(( ESCOUNT += 1000000 ))
(( TWCOUNT += 1000000 ))
ES=`echo ${ESCOUNT} | cut -b 3-`
TW=`echo ${TWCOUNT} | cut -b 3-`
echo ${IPPAD} : ESTABLISHED:${ES} TIME_WAIT:${TW}
done
echo ; echo
netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n | sed 's/d)/d/'
Quando você executa isso, você deve ver algo assim:
[root@*** ~]# /root/ShowConnProfiles.sh
10.48.22.4......................... : ESTABLISHED:00002 TIME_WAIT:00008
10.48.22.8......................... : ESTABLISHED:00000 TIME_WAIT:00002
10.64.51.130....................... : ESTABLISHED:00001 TIME_WAIT:00000
10.64.51.133....................... : ESTABLISHED:00000 TIME_WAIT:00079
10.64.51.134....................... : ESTABLISHED:00002 TIME_WAIT:00001
10.64.51.17........................ : ESTABLISHED:00003 TIME_WAIT:01160
10.64.51.171....................... : ESTABLISHED:00002 TIME_WAIT:00000
10.64.51.174....................... : ESTABLISHED:00000 TIME_WAIT:00589
10.64.51.176....................... : ESTABLISHED:00001 TIME_WAIT:00570
1 established
1 Foreign
11 LISTEN
25 ESTABLISHED
1301 TIME_WAIT
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:
service httpd stop
sleep 30
service httpd start
Se necessário, faça isso com todos os servidores web
service httpd stop (on all web servers)
service mysql stop
sleep 120
service mysql start
service httpd start (on all web servers)
ESCALAÇÃO # 2
Você pode forçar o sistema operacional a eliminar TIME_WAITs para mysql ou qualquer outro aplicativo com o seguinte:
SEC_TO_TIMEWAIT=1
echo ${SEC_TO_TIMEWAIT} > /proc/sys/net/ipv4/tcp_tw_recycle
echo ${SEC_TO_TIMEWAIT} > /proc/sys/net/ipv4/tcp_tw_reuse
Isso fará com que TIME_WAITs atinja o tempo limite em 1 segundo.
Para dar crédito onde o crédito é devido ...
wait_timeout
causar o fechamento de uma conexão quando o software espera que ele permaneça aberto.