我需要摆脱OS X 10.7.1上令人讨厌的“系统中打开文件太多”的限制。
有办法吗?
我需要摆脱OS X 10.7.1上令人讨厌的“系统中打开文件太多”的限制。
有办法吗?
Answers:
根据这篇有用的文章(我建议阅读):
默认情况下,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
(您可能必须创建),如下所示:
kern.maxfiles=20480
kern.maxfilesperproc=18000
注意:在OS X 10.10或更低版本中,您可以在/etc/launchd.conf
like中添加设置,limit maxfiles
它将覆盖您在此处放置的所有内容。
再次,从文章:
完成此操作后,内核本身将具有最大数量的文件,但Shell可能没有。而且由于大多数将占用这么多文件的进程将由Shell启动,因此您将需要增加它。
该命令是:
ulimit -S -n 2048 # or whatever number you choose
这种改变也是暂时的。它仅在当前的shell会话中持续。你可以把它添加到你的shell配置文件(.bashrc
,.zshrc
如果你想运行每次打开一个shell时间或其他)。
kern.maxfiles=65000 kern.maxfilesperproc=65000
/etc/sysctl.conf并重新启动。kern.maxfiles被忽略并保留默认值,但kern.maxfilesperproc设置为65000。我没有/etc/launchd.conf,所以这是怎么回事?
似乎有一种完全不同的方法可以更改每个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. 更改新文件的所有者:
sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist
3. 加载以下新设置:
sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist
4. 最后,检查限制是否正确:
launchctl limit maxfiles
IO Error: Bad file descriptor (Write failed)
您将需要增加ulimit设置-这些天在OS X上非常低-默认为256。添加ulimit -n 4096
或类似于〜/ .profile或等效文件,它将在您的本地环境中解决。运行ulimit -a
检查您当前的水平
要查看系统设置,请运行以下命令:
launchctl limit maxfiles
在Lion(10240)中,每个进程的设置都比以前高很多。但是,如果仍在此处击中它,则可以使用具有所需级别的同一命令将其设置得更高。要使更改永久生效,需要在/etc/launchd.conf中添加相关行。
ulimit -a
)。
其他选择可能是找到罪魁祸首:
sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
对于最后一个,您可以看到打开了哪些文件:
sudo lsof -n | grep socketfil
并根据需要终止该过程
kill $pid
从评论:
值得一提的是,您还可以使用
lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail
-h
sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
-h
lsof -n +c 0
以防止截断进程名。
对于最新的macOS(在撰写本文时:10.14.1),您可以使用sudo launchctl limit maxfiles 64000 524288
(默认为256),但它仅在当前会话中有效。使用launchctl
@ninjaPixel(https://superuser.com/a/1171028/760235)中的作业获得永久解决方案。
毕竟,我的java上面所做的所有更改都没有产生超过10000个文件。解决方案是此jvm标志-XX:-MaxFDLimit
我在执行chmod -R时遇到了它,所以我采取了一些较小的步骤来解决它,例如
# for each directory
find . -type d -exec chmod 755 {} \;
类似于https://superuser.com/a/1171028/367819
要检查Mac OS X系统上的当前限制,请运行:
launchctl limit maxfiles
最后两列分别是软限制和硬限制。
要在Mac OS X Yosemite中在系统范围内调整打开文件的限制,必须创建两个配置文件。第一个是/Library/LaunchDaemons/limit.maxfiles.plist中的属性列表(aka 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--权限。默认情况下,此权限应该存在,但是您可以通过运行sudo chmod 644来确保它们已存在。尽管上述步骤将导致重新启动时正确设置系统范围的打开文件限制,但是您可以通过运行launchctl limit来手动应用它们。
除了在系统级别上设置这些限制外,我们还建议在会话级别上设置,方法是在bashrc,bashprofile或类似文件中附加以下几行:
ulimit -n 200000
ulimit -u 2048
与plist文件一样,您的bashrc或类似文件应具有-rw-r--r--权限。此时,您可以重新启动计算机,并在终端中输入ulimit -n。如果系统配置正确,则应该看到maxfiles已设置为200000。
您可以阅读本文以了解更多详细信息。
https://gist.github.com/tombigel/d503800a282fcadbee14b537735d202c
请记住重新启动Mac,以使这些值生效。