根据这篇有用的文章(我推荐阅读):
默认情况下,Mac OS X可以打开的最大文件数被设置为12,288,而一个给定进程可以打开的最大文件数为10,240。
你可以通过以下方法来检查:
sysctl kern.maxfiles
sysctl kern.maxfilesperproc
sysctl -w kern.maxfiles=20480
你可以通过以下方法来增加限制(风险自担)。
sysctl -w kern.maxfilesperproc=18000
(或您选择的任何数字) sudo
(或您选择的任何数字) 要想永久更改,请使用 /etc/sysctl.conf
将您的设置放入 /etc/launchd.conf
(您可能需要创建的),就像这样:
kern.maxfiles=20480
kern.maxfilesperproc=18000
注意:在 OS X 10. 10或更低的版本,你可以像limit maxfiles
一样在.bashrc
中添加设置,它将覆盖你在这里放的任何东西。
同样,从文章中可以看到:
一旦你这样做了,内核本身就会有一个最大的文件数量,但shell可能没有。
命令是:
ulimit -S -n 2048 # or whatever number you choose
如果你想让它在每次打开shell时都运行,你可以把它添加到你的shell配置文件中(.zshrc
, &007或其他什么的)。
似乎每个版本的OS X的打开文件限制有完全不同的方法!
**对于OS X Sierra*(10.12.X),你需要:
1.在/Library/LaunchDaemons/limit.maxfiles.plist
处创建一个文件,然后粘贴以下内容(随意更改两个数字(分别是软限制和硬限制):
<?xml version="1.0" encoding="UTF-8"?>
<!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>64000</string>
<string>524288</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
2.2. **更改新文件的所有者:
sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist
3.加载这些新的设置:
sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist
4.*最后,检查限制是否正确:
launchctl limit maxfiles
朋友们,在Mavericks 10.9.4
ulimit -n 2048
上可以正常工作。你可能需要启动一个新的登录会话。
对于最新的macOS (编写时:10.14.1),你可以使用sudo launchctl limit maxfiles 64000 524288
(默认为256),但它只在当前会话中工作。使用@ninjaPixel https://superuser.com/a/1171028/760235 )的launchctl
作业来永久解决。
经过上面所有的修改,我的java没有做超过10000个文件。解决的办法是这个jvm标志 **-XX:-MaxFDLimit*
类似于https://superuser.com/a/1171028/367819
要检查Mac OS X系统上的当前限制,请运行:
launchctl limit maxfiles
最后两列分别是软限制和硬限制。第一个是/Library/LaunchDaunchDaemons/limit.maxfiles.plist中的属性列表(又名plist)文件,该文件包含以下XML配置:
<?xml version="1.0" encoding="UTF-8"?>
<!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>200000</string>
<string>200000</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
这将把打开文件限制设置为200000。第二个plist配置文件应该存储在/Library/LaunchDaemons/limit.maxproc.plist中,其内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!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.maxproc</string>
<key>ProgramArguments</key>
<array>
<string>launchctl</string>
<string>limit</string>
<string>maxproc</string>
<string>2048</string>
<string>2048</string>
</array>
<key>RunAtLoad</key>
<true />
<key>ServiceIPC</key>
<false />
</dict>
</plist>
这两个plist文件必须由root:wheel拥有,并且权限为-rw-r-r-r–r–。这个权限应该是默认的,但你可以通过运行 sudo chmod 644 来确保这些权限到位。虽然上面介绍的步骤会使系统范围内的打开文件限制在重启时被正确设置,但你也可以通过运行 launchctl limit 手动应用这些限制。这时,你可以重启你的电脑,在终端上输入 ulimit -n。如果你的系统配置正确,你应该看到maxfiles已经被设置为200000。
你可以参考这篇文章了解更多细节。