Mac OS X YosemiteでToo many open filesが発生したときの対処法

Mac上でPHP Laravelを組み込みサーバー

$ 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なんかであるファイルディスクリプタを超えてしまったようなエラー内容なので、そこにあたりをつけ確認した記録。

現状の設定確認

環境は

Mac OS X 10.10.5 Yosemite

まずは、現状の設定状況の確認。

$ 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