[サーバー] ファイル記述子 オーバー

あるサイトのエラー対策に付き合いました。そのサイトでは PHP + MySQL アプリを運用しているのですが、アプリを新しいバージョンに上げてから Too many open files in system などのエラーが発生しメールが受信できなくなったり、FTPSSHでログイン出来なくなたりしていました。

そのような状態になった時に、Apache(=PHP) や MySQLを止めても状況が改善されませんでした。サーバーをリーブートすればエラーは発生しなくなるのですが、時間がたつとまたエラーに。

PHPのプログラムがヘンでファイルを多数オープンし続けていたとしても、Apache(=PHP) を停止すれば ファイル記述子は解放されるはずです。 なぜ ?・・・・


サーバーのホスティング会社とのやり取りで サーバーが使っているリソースの一覧を表示するコマンドを教えてもらいました。そのサーバーはヴァーチャルサーバーなのでリソースの一覧などが簡単に見れます。
たしかに、アプリのある機能を使うと ファイル記述子が一気に 2000以上増えます。そしてApache(=PHP) を停止しても 100程度しか減りません・・・?

ホスティング会社とのやり取りメールの中に、ファイル記述子は IPC 等でも使われると書いてありました ・・・・・ これかも! ひらめきました !!


PHPアプリでIPC等を使ってないか調べると −−−−−−− ありました !!
なんと、何らかのデータを 共有メモリーに キャッシュしています。それもデータ毎に一つずつ共有メモリーをオープンしています。 しかもオープンする数の上限チェックなどは無いようです ^^;

というわけで、アプリのソースに手を入れキャッシュを無効にして、解決しました ^^)/

共有メモリーですから、それをオープンしたPHP(=Apache) を止めても解放はされない訳ですね。