Понижение значения довольно тривиально без перезапуска MySQL
Допустим, вы хотите уменьшить время ожидания до 30 секунд
Сначала добавьте это в my.cnf
[mysqld]
interactive_timeout=30
wait_timeout=30
Затем вы можете сделать что-то вроде этого
mysql -uroot -ppassword -e"SET GLOBAL wait_timeout=30; SET GLOBAL interactive_timeout=30"
Все соединения с БД после этого будут отключены через 30 секунд
ПРЕДУПРЕЖДЕНИЕ
Убедитесь, что вы используете явно использовать mysql_close. Я не доверяю Apache, как большинство разработчиков. В противном случае иногда возникает состояние гонки, при котором Apache закрывает соединение с БД, но не сообщает mysqld, и mysqld удерживает это соединение открытым до истечения времени ожидания. Хуже того, вы можете чаще видеть TIME_WAIT. Выберите значения тайм-аута с умом.
ОБНОВЛЕНИЕ 2012-11-12 10:10 ПО ВОСТОЧНОМУ ВРЕМЕНИ
ПРЕДОСТЕРЕЖЕНИЕ
После применения моих опубликованных предложений создайте сценарий /root/show_mysql_netstat.sh
со следующими строками:
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/'
Когда вы запустите это, вы должны увидеть что-то вроде этого:
[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
Если вы все еще видите много mysql TIME_WAITs
для любого данного веб-сервера, вот два шага эскалации:
ESCALATION # 1
Авторизуйтесь на веб-сервере и перезапустите apache следующим образом:
service httpd stop
sleep 30
service httpd start
При необходимости сделайте это для всех веб-серверов.
service httpd stop (on all web servers)
service mysql stop
sleep 120
service mysql start
service httpd start (on all web servers)
ESCALATION # 2
Вы можете заставить ОС уничтожать TIME_WAIT для mysql или любого другого приложения с помощью следующего:
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
Это приведет к истечению времени TIME_WAIT через 1 секунду.
Чтобы дать кредит, где кредит должен ...
wait_timeout
приведет к закрытию соединения, когда оно ожидает, что оно останется открытым.