Việc hạ thấp giá trị là khá nhỏ mà không cần khởi động lại mysql
Giả sử bạn muốn giảm thời gian chờ xuống 30 giây
Đầu tiên, thêm cái này vào my.cnf
[mysqld]
interactive_timeout=30
wait_timeout=30
Sau đó, bạn có thể làm một cái gì đó như thế này
mysql -uroot -ppassword -e"SET GLOBAL wait_timeout=30; SET GLOBAL interactive_timeout=30"
Tất cả các kết nối DB sau này sẽ hết thời gian trong 30 giây
CẢNH BÁO
Hãy chắc chắn để sử dụng rõ ràng sử dụng mysql_c Đóng. Tôi không tin tưởng Apache như hầu hết các nhà phát triển làm. Nếu không, đôi khi, có một điều kiện cuộc đua trong đó Apache đóng Kết nối DB nhưng không thông báo cho mysqld và mysqld giữ kết nối đó mở cho đến khi hết thời gian. Thậm chí tệ hơn, bạn có thể thấy TIME_WAIT thường xuyên hơn. Chọn giá trị thời gian chờ của bạn một cách khôn ngoan.
CẬP NHẬT 2012-11-12 10:10 EDT
CẨN THẬN
Sau khi áp dụng các đề xuất đã đăng của tôi, hãy tạo một tập lệnh được gọi /root/show_mysql_netstat.sh
với các dòng sau:
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/'
Khi bạn chạy cái này, bạn sẽ thấy một cái gì đó như thế này:
[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
Nếu bạn vẫn thấy rất nhiều mysql TIME_WAITs
cho bất kỳ máy chủ web cụ thể nào, đây là hai bước leo thang cần thực hiện:
THAM GIA # 1
Đăng nhập vào máy chủ web vi phạm và khởi động lại apache như sau:
service httpd stop
sleep 30
service httpd start
Nếu cần, hãy làm điều này với tất cả các máy chủ 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
Bạn có thể buộc HĐH tiêu diệt TIME_WAITs cho mysql hoặc bất kỳ ứng dụng nào khác bằng cách sau:
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
Điều này sẽ khiến TIME_WAIT hết thời gian trong 1 giây.
Cung cấp tín dụng khi tín dụng đáo hạn ...
wait_timeout
khiến kết nối bị đóng khi phần mềm mong muốn nó vẫn mở.