Réduire la valeur est assez trivial sans un redémarrage de mysql
Disons que vous voulez réduire les délais d'attente à 30 secondes
Tout d'abord, ajoutez ceci à my.cnf
[mysqld]
interactive_timeout=30
wait_timeout=30
Ensuite, vous pouvez faire quelque chose comme ça
mysql -uroot -ppassword -e"SET GLOBAL wait_timeout=30; SET GLOBAL interactive_timeout=30"
Toutes les connexions à la base de données après ce délai expireront dans 30 secondes
ATTENTION
Assurez-vous d'utiliser explicitement mysql_close. Je ne fais pas confiance à Apache comme le font la plupart des développeurs. Sinon, il existe parfois une situation de concurrence critique dans laquelle Apache ferme une connexion à une base de données mais n'informe pas mysqld et ce dernier maintient cette connexion ouverte jusqu'à l'expiration du délai imparti. Pire encore, il est possible que vous voyiez plus souvent TIME_WAIT. Choisissez judicieusement vos valeurs de délai d'attente.
MISE À JOUR 2012-11-12 10:10 EDT
CAVEAT
Après avoir appliqué mes suggestions postées, créez un script appelé /root/show_mysql_netstat.sh
avec les lignes suivantes:
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/'
Lorsque vous exécutez ceci, vous devriez voir quelque chose comme ça:
[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 vous voyez toujours beaucoup de mysql TIME_WAITs
pour un serveur Web donné, voici deux étapes à suivre:
ESCALATION # 1
Connectez-vous au serveur Web incriminé et redémarrez apache comme suit:
service httpd stop
sleep 30
service httpd start
Si nécessaire, faites-le sur tous les serveurs Web.
service httpd stop (on all web servers)
service mysql stop
sleep 120
service mysql start
service httpd start (on all web servers)
ESCALATION # 2
Vous pouvez forcer le système d'exploitation à tuer TIME_WAIT pour mysql ou toute autre application avec les éléments suivants:
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
Cela fera que TIME_WAIT expire en 1 seconde.
Donner un crédit lorsqu'un crédit est dû ...
wait_timeout
une connexion plus courte provoque la fermeture d'une connexion alors que le logiciel s'attend à ce qu'elle reste ouverte.