macのファイルディスクリプタは初期値で256しかない

macのファイルディスクリプタは初期値で256しかないため、プロセスで扱うファイルが多くなるとエラーが発生します。

[bash] Close archive failed: Failure to create temporary file: Too many open files [/bash]

最初はファイルのリソース管理を忘れたのかと思ったのですが、ソースコードを見直してもファイルのリソースを適切に管理しているように思えました。そこで、いろいろと調べてみたところ limit.conf の設定を変更すればよいらしいことにたどり着きました。

limit.conf ってなんだっけーか?と思ったのですが、思い出しました。プロセスごとの制限事項が定義されているファイルになります。ということで早速確認してみると、macではファイルディスクリプタの初期上限値が256となっていました。

[bash] $ 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

$ ulimit -n 256 [/bash]

さすがに256は少ないだろうと言うことで、早速変更しました。ソフトリミットを15000に設定することで上限らしい値に設定されました。

[bash] $sudo launchctl limit maxfiles 15000 150000 $ ulimit -n 10240 [/bash]

unlimitで設定する場合は一時的に変更しているだけのため、再起動や再ログインで初期化されてしまうためlaunchctlで設定しました。この辺はきちんと整理する必要がありますね。

ちょうど通勤途中に なるほどUnixプロセス を読んでいたこともあり、ファイルディスクリプタがどういうものかは理解していたので調べやすかったです。

なるほどUnixプロセス ― Rubyで学ぶUnixの基礎
Jesse Storimer, 島田浩二(翻訳), 角谷信太郎(翻訳)
達人出版会
発行日: 2013-04-25
対応フォーマット: EPUB, PDF, ZIP

この本は、ちょうど先日購入したNexus7 2013 で読んでいますが、一つ一つの章が小さいことと内容が平易なためわかりやすくおすすめです。