単純なミスでMySQLのプロセスが溜まってしまった話
あるサイトのサーバーを移転させたら、MySQLのプロセスが溜まってすぐに max_connections の設定値まで達してしまうという状態になってしまいました。
プロセスの状態は「SHOW PROCESSLIST;」というコマンドで確認できます。実際に SHOW PROCESSLIST で見てみるとほとんどのプロセスが「Sleep」の状態のまま待機していました。
mysql> SHOW PROCESSLIST; +------+--------------+-----------+-----------+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +------+--------------+-----------+-----------+---------+------+-------+------------------+ | 10 | username | localhost | dbname | Sleep | 403 | | NULL | | 11 | username | localhost | dbname | Sleep | 196 | | NULL | | 12 | username | localhost | dbname | Sleep | 706 | | NULL | | 79 | username | localhost | dbname | Sleep | 132 | | NULL | | 84 | username | localhost | dbname | Sleep | 460 | | NULL |
こんな状態で100個。
プログラムのどこかでエラーが発生しているのか、それともプログラムが実行されたままなのか。MySQLのエラーログには何もエラーが出ていなかったので、PHPのほうかなとApacheのエラーログを見てみると、
Cache couldn't make dir './cache'. Cache unable to open file for writing: ./cache/3280ee5642a113a188b45ae5db161bdd Cache couldn't make dir './cache'.
なにやらキャッシュ用のディレクトリが作れないというエラーが大量に・・・。調べてみるとフィードを読み込むのに使っていたMagpieRSS用のキャッシュディレクトリがきちんと指定できておらず、キャッシュが使えずに常にフィードをリクエストするという状態になっていました。
これが原因なのか・・・?と思ったのですが、とりあえずキャッシュ用のディレクトリをきちんと作ってみると、あっさりとMySQLのプロセスが溜まらなくなりました。
サイトのサイドバーでフィードを読み込んでいたので、アクセスがあるたびにフィードをリクエストする状態になってしまっていて、フィードのほうの負荷が高くなり、タイムアウトするまでデータベースの接続が閉じられなかったということでしょうか。
最初はデータベースの設定が間違っているのかなぁと思ったのですが、結局はプログラムのほう、というか移行によるディレクトリ設定の不備が原因というものでした。。まぁ解決できたので良かったです。
コメントを残す