2010年3月1日月曜日

MySQLで「Too many connections」のエラー

どうも、俺@週明け仕事中です。

週末、とあるシステムでMySQLの「Too many connections」が多発する障害が発生しました。
その時調べたメモです。

このエラーは、「コネクションの数が多すぎてもう接続できないよー」というものです。
MySQLの設定は
mysql> show global variables like '%max_connection%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 100 |
+-----------------+-------+
という状態です。
デフォルト値が「100」なのだそうで、まず単純にコネクション最大数を増やします。
mysql> set global max_connections = 256;
コネクション数が増えるので、CPU負荷とメモリ使用量に注意が必要です。

他に注目すべきは、
mysql> show status like '%threads_%';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| Threads_cached | 6 |
| Threads_connected | 4 |
| Threads_created | 140909 |
| Threads_running | 3 |
+------------------------+--------+
うわー!エラいことなっとる!
ここの項目の見方は、
Threads_cached ... スレッドキャッシュでキャッシュされているスレッドの数。
Threads_connected ... 現在生成されているスレッドの数。
Threads_created ... 起動してから生成されたスレッドの数。この値が大きい場合はthread_cache_sizeの値を大きくした方が良いかも。
Threads_running ... 現在動作中のスレッド数。

と言うわけで、今回の件ではthread_cache_sizeの値を増やしておきます。
mysql> set global thread_cache_size = 64;
と、共にwait_timeoutの状況をチェック。
mysql> show global variables like 'wait_timeout%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| wait_timeout | 28800 |
+--------------------------+-------+
28800秒、つまり8時間に設定されているので、もう少し縮めて起きます。
mysql> set global wait_timeout = 3600;
1時間にしました。
wait_timeoutは接続があってスレッドが生成され待機状態(アイドル状態)になって○秒経過したら接続を切るというもの。
mysql_pconnect()やPDOでの持続的接続とかでも、wait_timeout秒数経過すると切断されます。(と、思う、、)
ちなみに、wait_timeouをmy.cnfに設定する場合は、
# vim /etc/my.cnf
set-variable = wait_timeout = 3600
のようにするらしい。


また経過監視します。以上どぇぇす。

1 件のコメント:

師子乃 さんのコメント...

こんばんは。

運用中の障害は対応が大変ですね。