「MySQL Warning: Can’t create a new thread」エラーは、MySQL が新しいスレッドを作成できない場合に発生するエラーです。

Warning: mysql_connect(): Can't create a new thread (errno **);
if you are not out of available memory,
you can consult the manual for a possible OS-dependent bug...

利用しているVPSサーバではプロセス数やメモリ量が厳しく制限されているため、プロセスやメモリ制限によりMySQLが使用するスレッドが制限されてしまうと、新しい接続も受け入れることができなくなり、エラーを吐き出してサイトが死んでしまうようです。

googleのキャッシュにもエラーが表示していた

このmysqlの接続エラー画面が頻繁に出てしまっていたようで、恥ずかしながらgoogleのキャッシュにまでこれが表示される状態になってしまいました。

googleで「mysql If you are not out of available memory」と検索をすると、私と同じようにサイトの中身をこのエラー画面にされてしまっているサイトもチラホラ見られるので、似たような問題でお悩みの方も多いかもしれません。

一旦、googleのキャッシュは再度正常なものに変わったからよかったものの、このままでは再発が目に見えているので、早速プログラムを見直すことにしました。

プログラムでメモリ開放を

メモリ不足の原因は、自作PHP&SQLのプログラムにあるのは想像がついていたので、DBコネクションを適切に切断していなかったり、SQLの結果を保持したままメモリを解放をしてない部分を探し、プログラム側で明示的に開放しておくようにしました。

mysql_free_result();
mysql_close();

それ以降、だいぶ落ち着いてきたようで、体感でもサイト表示が早くなったような気がしております。

おわりに

メモリの使用量を削減し、プログラムのパフォーマンスを向上させるには、メモリを適切に解放することが大切ですが、適当に開放してしまうと、必要な変数を不意に消してしまったりと、バグのリスクも高まったり、パフォーマンスが低下したりする可能性もあるのでご注意ください。

もうすぐ6年目となるので、もう少々プログラムをしっかり勉強したいです。