Mac OS X YosemiteでToo many open filesが発生したときの対処法
$ php artisan serve
で開発をやっているときしばらくするとたまに、
[Thu Nov 26 17:16:02 2015] PHP Warning: Unknown: failed to open stream: Too many open files in Unknown on line 0
がでるので、Linuxなんかであるファイルディスクリプタを超えてしまったようなエラー内容なので、そこにあたりをつけ確認した記録。
現状の設定確認
環境は
まずは、現状の設定状況の確認。
$ sudo launchctl limit Password: cpu unlimited unlimited filesize unlimited unlimited data unlimited unlimited stack 8388608 67104768 core 0 unlimited rss unlimited unlimited memlock unlimited unlimited maxproc 709 1064 maxfiles 256 unlimited
maxfilesがファイルディスクリプタの設定。256なんて設定だと開発しているとき、たくさんのアプリケーションを開き、サーバーを起動させなんてやっていたらあっという間に超えてしまいそう。
一時的にファイルディスクリプタの設定を変更する
一時的な変更 ファイルディスクリプタの設定前に現場の設定値を確認する。
$ ulimit -n 256
次にファイルディスクリプタを設定する。
$ ulimit -n 2028
設定されているか確認する。
$ ulimit -n 2028
というわけで設定が反映されているがめ、一時的な設定はOK。 再起動なしで設定が反映されます。
恒久的にファイルディスクリプタの設定を変更する
まずは確認
$ sudo launchctl limit Password: cpu unlimited unlimited filesize unlimited unlimited data unlimited unlimited stack 8388608 67104768 core 0 unlimited rss unlimited unlimited memlock unlimited unlimited maxproc 709 1064 maxfiles unlimited 256
以下のファイルを作成して、記述。
$ sudo vi /etc/launchctl.conf
limit maxfiles 65536 65536
そして再起動。。
$ ulimit -n
256
反映されていない。。 ちまたに溢れている情報だとこのやり方なのですが、新しMacのOSだとうまくいかないのかも。
気を取り直して、英文のWebを読み進め、
/Library/LaunchDaemons/limit.maxfiles.plist
を設定する方法があることを発見。
ファイルがない場合は以下を作成して、記述。
$ sudo vim /Library/LaunchDaemons/limit.maxfiles.plist
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>limit.maxfiles</string> <key>ProgramArguments</key> <array> <string>launchctl</string> <string>limit</string> <string>maxfiles</string> <string>524288</string> <string>524288</string> </array> <key>RunAtLoad</key> <true/> <key>ServiceIPC</key> <false/> </dict> </plist>
再起動。。。。
おもむろに設定値を確認する。。
$ ulimit -n
524288
反映されている。。
恒久的に反映する方法で、なんだか疲れたけど。 なんとかうまくいきました。
それではm(__)m