稼働中のシステムにおいて発生するトラブルのひとつに、MySQLのコネクションに関するトラブルがあります。
“アプリケーションからDBコネクションを取得できない!””想定以上にアプリケーションがコネクションを取得している”といったとトラブルになります。
今回は、MySQLのコネクションに関するトラブルが発生した場合に調査するポイントと、調査のために実行するコマンドについて紹介していきます。
現在のコネクション数を確認
MySQLに、現在接続しているコネクション数を確認するには、show status コマンドを実行します。
MySQLにログインしてコマンドを実行します。
mysql> show status like 'Threads_connected'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_connected | 29 | +-------------------+-------+ 1 row in set (0.00 sec)
上記コマンドで現在接続されているコネクション数を確認して、MySQLで許可している最大コネクション数を超えていないかの確認が可能です。
最大コネクション数を確認
MySQLが許可している最大コネクション数を確認します。
このコネクション数が接続される可能性がある数を超えてしまうので、MySQLに接続できない状態になってしまいます。
mysql> SHOW GLOBAL VARIABLES like 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 512 | +-----------------+-------+ 1 row in set (0.01 sec)
接続元のIPを確認
現在のプロセスを一覧で表示して、発生しているコネクションが、どのサーバから接続されているかの確認も可能です。
mysql> SHOW processlist; +------------+------------+------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +------------+------------+---------------------+--------+ ・ ・ ・
Hostカラムが接続元サーバのIPとPORTです。
MySQLを起動してからの最大接続数を確認
MySQLを起動してから接続された最大コネクション数も確認することができます。
トラブルが発生しても、調査を開始したタイミングではコネクション数は問題ない場合があります。
しかし、トラブル発生直後はコネクション数が規定値をオーバーしている可能性があるので、このコマンドを実行して過去の最大コネクション数を確認するとよいです。
mysql> show global status like 'Max_used_connections'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | Max_used_connections | 513 | +----------------------+-------+ 1 row in set (0.00 sec)
DBサーバのKeepAliveを確認
TomcatなどのWEBアプリケーションがコネクションプールを取得している状態で、Tomcatが起動しているサーバが落ちてしまうと、MySQLのコネクションは残ってしまいます。
このコネクションは不要なコネクションとなるのですが、一定時間が過ぎると自動的にコネクションは解放されます。
この「一定時間」は、MySQLがインストールされているサーバのKeepAliveパケット送信の設定に依存します。
システム設定値となり、以下のコマンドで格納可能です。
以下の設定例では、60秒で不要なコネクションは解放されます。
$>sysctl -a ・ ・ ・ net.ipv4.tcp_keepalive_intvl=5 net.ipv4.tcp_keepalive_probes=6 net.ipv4.tcp_keepalive_time=30 ・ ・ ・
30秒間隔でKeepAliveパケットを6回送信する。
その6回は5秒間隔、という設定になります。
各項目の説明を一応記載しておきます。
net.ipv4.tcp_keepalive_intvl |
KeepAliveパケットを送信する間隔 |
net.ipv4.tcp_keepalive_probes |
KeepAliveパケットを送信する回数 |
net.ipv4.tcp_keepalive_time |
KeepAliveパケットを送信するまでの時間 |