Bajar el valor es bastante trivial sin un reinicio de mysql
Digamos que desea reducir los tiempos de espera a 30 segundos.
Primero, agregue esto a my.cnf
[mysqld]
interactive_timeout=30
wait_timeout=30
Entonces, puedes hacer algo como esto
mysql -uroot -ppassword -e"SET GLOBAL wait_timeout=30; SET GLOBAL interactive_timeout=30"
Todas las conexiones de base de datos después de esto expirarán en 30 segundos
ADVERTENCIA
Asegúrese de usar explícitamente mysql_close. No confío en Apache como lo hacen la mayoría de los desarrolladores. Si no, a veces, hay una condición de carrera en la que Apache cierra una conexión DB pero no informa a mysqld y mysqld mantiene esa conexión abierta hasta que se agota el tiempo de espera. Peor aún, puede ver TIME_WAITs con más frecuencia. Elija sus valores de tiempo de espera sabiamente.
ACTUALIZACIÓN 2012-11-12 10:10 EDT
ADVERTENCIA
Después de aplicar mis sugerencias publicadas, cree un script llamado /root/show_mysql_netstat.sh
con las siguientes líneas:
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/'
Cuando ejecute esto, debería ver algo como esto:
[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
Si todavía ve una gran cantidad de mysql TIME_WAITs
para cualquier servidor web dado, aquí hay dos pasos de escalación a seguir:
ESCALACIÓN # 1
Inicie sesión en el servidor web infractor y reinicie Apache de la siguiente manera:
service httpd stop
sleep 30
service httpd start
Si es necesario, haga esto a todos los servidores web
service httpd stop (on all web servers)
service mysql stop
sleep 120
service mysql start
service httpd start (on all web servers)
ESCALACIÓN # 2
Puede forzar al sistema operativo a eliminar TIME_WAITs para mysql o cualquier otra aplicación con lo siguiente:
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
Esto hará que TIME_WAITs agote el tiempo de espera en 1 segundo.
Para dar crédito donde se debe crédito ...
wait_timeout
hace que se cierre una conexión cuando el software espera que permanezca abierto.