週末、とあるシステムで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%';28800秒、つまり8時間に設定されているので、もう少し縮めて起きます。
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| wait_timeout | 28800 |
+--------------------------+-------+
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 件のコメント:
こんばんは。
運用中の障害は対応が大変ですね。
コメントを投稿