OS X 10.7.1上是否存在“系统中打开文件过多”错误的修复程序?


190

我需要摆脱OS X 10.7.1上令人讨厌的“系统中打开文件太多”的限制。 

有办法吗?


4
您想进一步说明何时发生吗?在什么情况下?
slhck 2012年

1
@slhck-我有同样的问题。这种情况基本上是“随机的”。我是一名开发人员,所以我大量使用Mac:同时运行一个或多个数据库,Web服务器,测试工具,一个或多个浏览器以及一个音乐播放器。谷歌浏览器似乎是一个打开了很多文件的程序。
弥敦道(Nathan Long)

其实,我的“大量使用”不是问题。我的内核和每个进程的最大打开文件数设置远低于默认值。
弥敦道(Nathan Long)

2
如果您阅读了Nathan的评论,并且想知道为什么他不包括有关默认值的任何详细信息,那是因为他在下面的答案中将其全部拼写了出来。(好的答案!:)
Olie

我和Nathan Long处于相同的使用情况下,并且发现重新启动Apache是​​“解决”问题的唯一步骤。我应用了以下所有限制增加值,但它们并没有立即起作用。我在同一台Macbook上运行命令行phpUnit测试>硒服务器> firefox> apache> php> mysql。在我升级为特立独行者之前,过去一直工作正常。我得到的错误在于正在测试的webapp,即php / apache文件耗尽,因此大概不受shell设置控制。
scipilot 2014年

Answers:


225

根据这篇有用的文章(我建议阅读):

默认情况下,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.conflike中添加设置,limit maxfiles它将覆盖您在此处放置的所有内容。

再次,从文章:

完成此操作后,内核本身将具有最大数量的文件,但Shell可能没有。而且由于大多数将占用这么多文件的进程将由Shell启动,因此您将需要增加它。

该命令是:

ulimit -S -n 2048 # or whatever number you choose

这种改变也是暂时的。它仅在当前的shell会话中持续。你可以把它添加到你的shell配置文件(.bashrc.zshrc如果你想运行每次打开一个shell时间或其他)。


1
单击启动区域中的图标启动的进程有什么限制?以及如何更改该限制?当您说“外壳”时,我假设您是指交互式终端外壳。
Cheeso 2012年

@Cheeso-我认为可以控制整个系统限制(sysctl)或启动的限制(以较低者为准)。
内森·朗

1
创建一个/etc/launchd.conf且内容限制为maxfiles 1000000 1000000对我来说非常有用!(此处为OSX 10.8.2)
Zugwalt

1
我放入kern.maxfiles=65000 kern.maxfilesperproc=65000/etc/sysctl.conf并重新启动。kern.maxfiles被忽略并保留默认值,但kern.maxfilesperproc设置为65000。我没有/etc/launchd.conf,所以这是怎么回事?
pferrel 2014年

2
如果有人遇到最大文件无法粘贴的问题,那是因为在maxfiles行之后有一个尾随空格,需要删除该空格。
jjathman '16

62

似乎有一种完全不同的方法可以更改每个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

工作完美,谢谢!在我的情况下,该错误在带有消息的Java进程中显示IO Error: Bad file descriptor (Write failed)
agradl

1
也适用于El Capitan 10.11.6
Troy Daniels

仍然无法更改shell的ulimit。无论我做什么,最多可保留1024个
DataGreed

在第2步中运行:sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root /Library/LaunchDaemons/limit.maxfiles.plist
Hai Nguyen

32

您将需要增加ulimit设置-这些天在OS X上非常低-默认为256。添加ulimit -n 4096或类似于〜/ .profile或等效文件,它将在您的本地环境中解决。运行ulimit -a检查您当前的水平

要查看系统设置,请运行以下命令:

launchctl limit maxfiles

在Lion(10240)中,每个进程的设置都比以前高很多。但是,如果仍在此处击中它,则可以使用具有所需级别的同一命令将其设置得更高。要使更改永久生效,需要在/etc/launchd.conf中添加相关行。


1
256?对我来说,它是2560个文件描述符,但我从未更改过。限制为266个进程(cf ulimit -a)。
slhck 2012年

2
我也一样,MacOS X Maverick上的256个文件
Climbatize 2014年

4
在OS X Yosemite上也
亚历山大

2
El Capitan上的256。
TMN 2016年

1
优胜美地256。
Jaec

31

其他选择可能是找到罪魁祸首:

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

有帮助!但是在OS X(10.11)上排序不需要-h。(也许是-g?)
罗伯特·卡尔洪

对我来说-hsudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
即使

那就没有吧-h
sanmai'3

这是唯一可以帮助我扎根引起问题的答案。..::
SgtPooki

1
使用lsof -n +c 0以防止截断进程名。
vaughan

9

民间,在小牛10.9.4

ulimit -n 2048工作正常。您可能需要启动一个新的登录会话。



1

你可以跑

lsof -n

哪个进程打开了太多文件。

然后杀死它。

要么

sysctl -w kern.maxfiles=20480

改成更大的


3
请说明该答案与已经给出的答案有何不同。
斯蒂芬·劳奇


0

我在执行chmod -R时遇到了它,所以我采取了一些较小的步骤来解决它,例如

# for each directory
find . -type d -exec chmod 755 {} \;

1
尽管这可能是一种解决方法,但它似乎并未真正回答问题。也许解释一下您无法摆脱的信息,然后提出将其作为减少问题的一种方法,将会改善您的答案。
music2myear17年

0

类似于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,以使这些值生效。


如果已经有答案,则该帖子都应标记为重复,否则,请通过链接发布相关信息,因为该链接可能永远无效。
zymhan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.