27 Mac の ulimit

オープン可能なファイル数の上限 maxfiles (open files), 起動可能なプロセス数の上限 max proc (max user processes) を大きくしたい、という状況が生じた。

結構苦戦した (というか苦戦中)。 macOS のバージョンごとに事情が異なるらしい。

launchctl limit
あるいは個別の値だけを見るには
launchctl limit maxfiles
launchctl limit maxproc

例えば、普段使っている El Capitan の Mac では、 maxproc の hard limit が 1064, soft limit が 709, maxfiles の hard limit が unlimited, soft limit が 256 だった。

シェルの状況は ulimit コマンドで分かる。
mknoMacBook-Pro:~ mk$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 256
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited
mknoMacBook-Pro:~ mk$

シェルの設定を ulimit -n 数ulimi -u 数 で 変更可能という情報もあり、実際にそうして変更できた場合もあるが、 うまく行かない場合もあった (どこに条件の違いがあるのか分からなかった)。

システム上の制限値がシェルの制限値に影響している (709, 256 はコピーだろう) ようなので、システム上の制限値を変えることにした。

https://scrapbox.io/shokai/El%20Capitan%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%BF%E4%B8%8A%E9%99%90%E3%82%92%E4%B8%8A%E3%81%92%E3%82%8Bに書いてあることを実行した。

(もしかして ulimit osx el capitan が元ネタなのかな?)

maxproc を 2048, maxfiles を 524288 にしてある (どういう理由でこう選択したのだろう? ネットを徘徊すると、 maxproc はこの値にしている人が多いようだけど、 maxfiles の方は 65536 に留めている人も多い)。

limit.maxfiles.plist, limit.maxproc.plist は上の二つのサイトにあるものを参考にすると良い。

私が実行したのは、macOS Sierra の走っている Mac.
こうすれば設定が変更できる(?)
curl -O http://nalab.mind.meiji.ac.jp/~mk/misc/limit.maxfiles.plist
curl -O http://nalab.mind.meiji.ac.jp/~mk/misc/limit.maxproc.plist
(limit.max*.plist の内容は保証しません。)
sudo cp limit.maxfiles.plist /Library/LaunchDaemons/
sudo cp limit.maxproc.plist  /Library/LaunchDaemons/
sudo chown root:wheel /Library/LaunchDaemons/limit.max*.plist
sudo chmod 644 /Library/LaunchDaemons/limit.max*.plist
sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist
sudo launchctl load -w /Library/LaunchDaemons/limit.maxproc.plist
(最初に sudo ls と無害なコマンドを実行して、 パスワードを入力しておいてから、コピー&ペーストを2回実行すれば良いだろう。)


それから再起動したところ。
mknoMacBook-Pro:~ mk$ launchctl limit
	cpu         unlimited      unlimited
	filesize    unlimited      unlimited
	data        unlimited      unlimited
	stack       8388608        67104768
	core        0              unlimited
	rss         unlimited      unlimited
	memlock     unlimited      unlimited
	maxproc     2048           2048
	maxfiles    524288         524288
mknoMacBook-Pro:~ mk$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 524288
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 2048
virtual memory          (kbytes, -v) unlimited
mknoMacBook-Pro:~ mk$
無事、こちらが指定した通りになった。


後で別のマシンで試したところ、再起動をしなくても良いようだった (ターミナルを起動し直して ulimit -a としたら増えていた)。 やはり公式の解説文書が欲しい…


それから…なんでも今の Mac には、 "hard maximum" (proposed by Apple) というのがあって、 上の設定法は、その最大値を超えることは出来ないのだそうだ。 それを超えるためには、 "OS X Server" というのを買う必要があるとか。

なんか面倒くさくなって来た…

桂田 祐史
2018-03-01