ファイルを開きすぎているときに発生するのはわかるけれど、特にそこまで開いているはずがないのに「Too many open files」が発生していたときの話です。
XDebugのprofilerが開きつづけていた
原因としては、XDebugのprofilerを使用しているとめっちゃファイル開いているようでした。そういうものなのかどうかはわからないですが…
xdebugのprofiler_enableを0に設定すると治まりました。
開いているファイルの調査
プロセスが開いているファイルの調査にはlsofコマンドを使用しました。
php-fpmを使用していたので、
$ lsof -c php-fpm
で開いているファイルを見てみると、
php-fpm 15583 nginx 920w REG 0,36 398679 5552073 /path/xdebug/cachegrind.out.15583.0eeb6c (xxx.xxx.xxx.xxx:/nfs/path)
といった内容でいっぱい表示されたので気がつきました。
nfsマウントしたディレクトリを出力先に設定していたことも原因だったかもしれません。
本当にファイルディスクリプタが不足している場合
今回は不要にファイルを開いていたことが原因でしたが、本当に不足しているときはOSの設定とphp-fpmの設定を変更することになります。
OSの設定
OSのほうで最大値を変更する必要があります。これはOSごとに違うのでそれぞれ調べてみて下さい。
参考までにCentOS7の場合は次のサイトが詳しいです。
【CentOS7】ファイルディスクリプタをプロセス単位で設定する手順【systemd】
php-fpmの設定
OSの設定だけ変更しても上手くいきませんでした。
php-fpmには独自にリミットを書けている設定があり、そちらも変更する必要がありました。
php-fpm.confにある「rlimit_files 」の値を変更します。
rlimit_files = 4096
参考:
【CentOS7】ファイルディスクリプタをプロセス単位で設定する手順【systemd】
PHP-fpm Too Many Open Files 24 Error (set open file descriptor limit)