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"
これ以降のすべてのDB接続は30秒でタイムアウトします
警告
明示的にmysql_closeを使用してください。ほとんどの開発者がそうであるように、私はApacheを信頼していません。そうでない場合、ApacheがDB接続を閉じますが、mysqldに通知せず、mysqldがタイムアウトになるまでその接続を開いたままにするという競合状態がある場合があります。さらに悪いことに、TIME_WAITがより頻繁に表示される場合があります。タイムアウト値を賢明に選択してください。
更新2012-11-12 10:10 EDT
警告
投稿された提案を適用した後/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
TIME_WAITs
特定のWebサーバーでまだ多くのmysqlが表示される場合は、次の2つのエスカレーション手順を実行してください。
エスカレーション#1
問題のあるWebサーバーにログインし、次のようにapacheを再起動します。
service httpd stop
sleep 30
service httpd start
必要に応じて、これをすべてのWebサーバーに実行します
service httpd stop (on all web servers)
service mysql stop
sleep 120
service mysql start
service httpd start (on all web servers)
エスカレーション#2
次を使用して、mysqlまたは他のアプリのTIME_WAITを強制的に強制終了できます。
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
、ソフトウェアが開いたままであると予期しているときに接続が閉じた場合、Webサイトソフトウェアが破損しないことを確認する必要があります。