Abbassare il valore è piuttosto banale senza un riavvio mysql
Supponiamo che tu voglia ridurre i timeout a 30 secondi
Per prima cosa, aggiungi questo a my.cnf
[mysqld]
interactive_timeout=30
wait_timeout=30
Quindi, puoi fare qualcosa del genere
mysql -uroot -ppassword -e"SET GLOBAL wait_timeout=30; SET GLOBAL interactive_timeout=30"
Tutte le connessioni DB dopo questo scadono in 30 secondi
AVVERTIMENTO
Assicurati di usare esplicitamente usa mysql_close. Non mi fido di Apache come fanno molti sviluppatori. Altrimenti, a volte, esiste una condizione di competizione in cui Apache chiude una connessione DB ma non informa mysqld e mysqld di tenere aperta quella connessione fino al timeout. Ancora peggio, potresti vedere TIME_WAIT più spesso. Scegli saggiamente i valori di timeout.
AGGIORNAMENTO 2012-11-12 10:10 EDT
AVVERTIMENTO
Dopo aver applicato i miei suggerimenti pubblicati, crea uno script chiamato /root/show_mysql_netstat.sh
con le seguenti righe:
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 esegui questo, dovresti vedere qualcosa del genere:
[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 vedi ancora un sacco di mysql TIME_WAITs
per un determinato server Web, ecco due passaggi di escalation da eseguire:
ESCALATION # 1
Accedi al server Web offensivo e riavvia apache come segue:
service httpd stop
sleep 30
service httpd start
Se necessario, eseguire questa operazione su tutti i server 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
Puoi forzare il sistema operativo a eliminare TIME_WAITs per mysql o qualsiasi altra app con quanto segue:
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
Ciò farà scadere TIME_WAIT in 1 secondo.
Per dare credito quando il credito è dovuto ...
wait_timeout
causa la chiusura di una connessione quando il software prevede che rimanga aperto.