Abaisser la valeur est assez trivial sans redémarrer mysql
Disons que vous voulez abaisser les délais à 30 secondes
Tout d'abord, ajoutez ceci à my.cnf
[mysqld]
interactive_timeout=30
wait_timeout=30
Ensuite, vous pouvez faire quelque chose comme ceci
mysql -uroot -ppassword -e"SET GLOBAL wait_timeout=30; SET GLOBAL interactive_timeout=30"
Toutes les connexions à la base de données après cela expireront en 30 secondes
AVERTISSEMENT
Assurez-vous d'utiliser explicitement mysql_close. Je ne fais pas confiance à Apache comme la plupart des développeurs le font. Sinon, parfois, il y a une condition de course où Apache ferme une connexion de base de données mais ne le signale pas à mysqld et mysqld maintient cette connexion ouverte jusqu'à ce qu'elle expire. Pire encore, vous pouvez voir des TIME_WAITs plus souvent. Choisissez judicieusement vos valeurs de délai d'expiration.
MISE À JOUR 2012-11-12 10:10 EDT
AVIS
Après avoir appliqué mes suggestions publié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 ceci:
[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 TIME_WAITs
mysql pour un serveur web donné, voici deux étapes d'escalade à prendre:
ESCALADE #1
Connectez-vous au serveur web fautif et redémarrez Apache comme suit:
service httpd stop
sleep 30
service httpd start
Si nécessaire, faites-le pour tous les serveurs web
service httpd stop (sur tous les serveurs web)
service mysql stop
sleep 120
service mysql start
service httpd start (sur tous les serveurs web)
ESCALADE #2
Vous pouvez forcer le système d'exploitation à tuer les TIME_WAITs pour mysql ou toute autre application avec ce qui suit:
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 expirer les TIME_WAITs en 1 seconde.
Pour donner du crédit là où le crédit est dû...