Obniżenie wartości jest dość trywialne bez ponownego uruchomienia mysql
Powiedzmy, że chcesz skrócić limity czasu do 30 sekund
Najpierw dodaj to do my.cnf
[mysqld]
interactive_timeout=30
wait_timeout=30
Następnie możesz zrobić coś takiego
mysql -uroot -ppassword -e"SET GLOBAL wait_timeout=30; SET GLOBAL interactive_timeout=30"
Wszystkie połączenia DB po tym czasie przekroczą limit czasu za 30 sekund
OSTRZEŻENIE
Upewnij się, że używasz jawnie użyj mysql_close. Nie ufam Apache, jak większość programistów. Jeśli nie, czasami zdarzają się warunki wyścigu, w których Apache zamyka połączenie DB, ale nie informuje mysqld i mysqld utrzymuje połączenie otwarte, dopóki nie przekroczy limitu czasu. Co gorsza, możesz zobaczyć TIME_WAIT częściej. Wybierz mądrze wartości limitu czasu.
AKTUALIZACJA 2012-11-12 10:10 EDT
CAVEAT
Po zastosowaniu moich opublikowanych sugestii utwórz skrypt /root/show_mysql_netstat.sh
o następujących liniach:
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/'
Po uruchomieniu tego powinieneś zobaczyć coś takiego:
[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
Jeśli nadal widzisz dużo mysql TIME_WAITs
dla dowolnego serwera WWW, wykonaj dwa kroki eskalacji:
ESKALACJA # 1
Zaloguj się do szkodliwego serwera WWW i uruchom ponownie apache w następujący sposób:
service httpd stop
sleep 30
service httpd start
W razie potrzeby zrób to na wszystkich serwerach internetowych
service httpd stop (on all web servers)
service mysql stop
sleep 120
service mysql start
service httpd start (on all web servers)
ESKALACJA # 2
Możesz zmusić system operacyjny do zabicia TIME_WAIT dla mysql lub dowolnej innej aplikacji za pomocą:
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
Spowoduje to przekroczenie limitu czasu TIME_WAIT za 1 sekundę.
Udzielanie kredytu tam, gdzie jest on należny ...
wait_timeout
spowoduje zamknięcie połączenia, gdy oprogramowanie spodziewa się, że pozostanie otwarte.