Posted at

MySQLのwait_timeoutとthread_cache_sizeについて

More than 5 years have passed since last update.

ごくたまにアプリケーション側でエラーが出てアプリケーション側は終了しているのに、MySQLへのconnectionがそのまま残っていて、芋づる式にconnectionが溢れて行きサービスに繋がらなくなることが起きます。

根本的原因のアプリケーション側を直すべきなのですが、MySQL側でconnectionを長時間保持して欲しくない場合の設定を調べました。

デフォルトでは

wait_timeout = 28,800

となっており、8時間となっています。

これでは長すぎるので、my.cnfに以下を追記します。


my.cnf

wait_timeout = 15


ただ、こうするとアイドル時間の合計が15秒を超えるとconnectionが切られるので、毎回threadを生成したりconnectしたりするオーバーヘッドが大きくなってしまうようなので、以下を設定します。


my.cnf

#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生成のオーバーヘッドも大きくならない、はずです。

間違っていたらご指摘お願い致します。