PHPでそんなにファイルを開いていないのに「Too many open files」が発生してしまうとき

ヨメレバCSS
オリジナルCSS

 ファイルを開きすぎているときに発生するのはわかるけれど、特にそこまで開いているはずがないのに「Too many open files」が発生していたときの話です。

スポンサーリンク
GoogleAdSence レクタングル(大)

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

参考:

lsof:オープンしているファイルを調べる

【CentOS7】ファイルディスクリプタをプロセス単位で設定する手順【systemd】

PHP-fpm Too Many Open Files 24 Error (set open file descriptor limit)

スポンサーリンク
GoogleAdSence レクタングル(大)

シェアする

スポンサーリンク
GoogleAdSence レクタングル(大)