F.Ko-Jiの「一秒後は未来」

単純なミスで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のプロセスが溜まらなくなりました。

サイトのサイドバーでフィードを読み込んでいたので、アクセスがあるたびにフィードをリクエストする状態になってしまっていて、フィードのほうの負荷が高くなり、タイムアウトするまでデータベースの接続が閉じられなかったということでしょうか。

最初はデータベースの設定が間違っているのかなぁと思ったのですが、結局はプログラムのほう、というか移行によるディレクトリ設定の不備が原因というものでした。。まぁ解決できたので良かったです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など