ごくたまにアプリケーション側でエラーが出てアプリケーション側は終了しているのに、MySQLへのconnectionがそのまま残っていて、芋づる式にconnectionが溢れて行きサービスに繋がらなくなることが起きます。
根本的原因のアプリケーション側を直すべきなのですが、MySQL側でconnectionを長時間保持して欲しくない場合の設定を調べました。
デフォルトでは
wait_timeout = 28,800
となっており、8時間となっています。
これでは長すぎるので、my.cnfに以下を追記します。
wait_timeout = 15
ただ、こうするとアイドル時間の合計が15秒を超えるとconnectionが切られるので、毎回threadを生成したりconnectしたりするオーバーヘッドが大きくなってしまうようなので、以下を設定します。
#thread_cache_size = 8
thread_cache_size = 100
thread_cache_sizeのデフォルトは8です。
(thread_cache_sizeの値はどれくらいが良いのかまだ分かっていませんが、max_connectionに合わせるのが良いのでしょうか?)
また、MySQLを再起動せずに反映させるためにmysqlのコンソールで
mysql>SET GLOBAL wait_timeout = 15;
mysql>SET GLOBAL thread_cache_size = 100;
と設定します。
これで、死んでるconnectionもどんどん破棄していってくれて、thread生成のオーバーヘッドも大きくならない、はずです。
間違っていたらご指摘お願い致します。