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

有办法吗?

评论

您是否想进一步解释何时发生?在什么情况下?

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

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

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

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

#1 楼

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


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

再次,从本文:


完成此操作后,内核本身将具有最大数量的
文件,但shell可能没有。并且由于大多数将占用大量文件的进程将由外壳启动,因此您要
增加该文件。


命令原因是:

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


更改也是暂时的;它仅在当前的shell会话中持续。如果希望每次打开外壳程序时都可以运行它,则可以将其添加到外壳程序配置文件(.bashrc.zshrc或其他内容)中。

评论


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

– Cheeso
2012年8月15日,0:48

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

–楚格沃尔特
2013年2月1日19:26



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

– pferrel
2014年11月13日,0:47

我来这里至少每6个月左右找到一次此帖子!太棒了;)

– brandonscript
16年7月28日在1:46

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

– jjathman
16-10-14在16:27

#2 楼

似乎有一种完全不同的方法来更改每个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错误:错误的文件描述符(写入失败)

– agradl
17 Mar 22 '17 at 16:52

也适用于El Capitan 10.11.6

–特洛伊·丹尼尔斯(Troy Daniels)
17年4月17日在17:23

仍然无法更改shell的ulimit。无论我做什么,最大停留时间为1024

– DataGreed
17-10-6在0:46

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

–海阮
18年6月21日在8:00

#3 楼

另一种选择可能是找到罪魁祸首:
sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail

对于最后一个,您可以看到打开了哪些文件:
sudo lsof -n | grep socketfil

如果需要的话可以终止该进程
kill $pid


评论中的内容:

还可以使用最大的打开文件获取进程ID列表,
lsof -n +c 0 | sed -E 's/^[^ ]+[ ]+([^ ]+).*$//' | uniq -c | sort | tail



评论


有帮助!但是在OS X(10.11)上排序不需要-h。 (也许是-g?)

–罗伯特·卡尔洪(Robert Calhoun)
17 Mar 3 '17 at 14:52

对我而言,即使没有-h(OS X 10.12.3),也能很好地工作:sudo lsof -n |切-f1 -d''| uniq -c |排序尾巴

–vearutop
17 Mar 6 '17 at 3:42

所以没有-h就可以了

– Sanmai
17 Mar 6 '17 at 10:27

使用lsof -n + c 0来防止截断进程名称。

–vaughan
18年7月12日在11:45



运行Catalina,我更喜欢lsof -n + c 0 | sed -E's / ^([^] + [] + [^] +)。* $ / \ 1 /'| uniq -c |排序尾(即,将第一个打开的括号移到更左以在输出中包括命令名称)。给我这个:```... 629 Google \ x20Chrome 50163 669 phpstorm 89615681 Microsoft \ x20Outlook 89373 808 vpnkit-bridge 755 1176 zoom.us 1382```在这里,zoom,PID 1382,有1176个打开的文件,最多现在我系统上的任何进程。

–约瑟夫·奇克(Joseph Cheek)
20 Jul 19'4:16



#4 楼

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

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

launchctl limit maxfiles


Lion中的设置较高(10240)比以前的每个过程都要高。但是,如果仍在此处击中它,则可以使用相同的命令将其设置为更高的水平。要使更改永久生效,需要在/etc/launchd.conf中添加相关行。

评论


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

–slhck
2012年6月22日18:55

对我一样,在MacOS X Maverick上为256个文件

–攀登
2014年8月9日在6:44

在OS X Yosemite上也为256

–亚历山大
15年5月28日在9:52

El Capitan上的256。

– TMN
16年4月28日在10:53

优胜美地256。

– Jaec
16年6月16日在22:50

#5 楼

民间,在Mavericks 10.9.4

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

#6 楼

对于最新的macOS(在撰写本文时:10.14.1),您可以使用sudo launchctl limit maxfiles 64000 524288(默认为256),但仅在当前会话中有效。使用@ninjaPixel(https://superuser.com/a/1171028/760235)中的launchctl作业获得永久解决方案。

评论


您是怎么想出号码524288的?我以前的值为256,并且不受限制。

–筹码Roberson
19-10-6在21:39

#7 楼

类似于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
19年5月30日在1:04

为我完美地工作。运行Mojave 10.14.6

– Aditya Garg
20 Mar 4 '20 at 20:10

#8 楼

毕竟,在我的Java上面进行的所有更改后,所做的文件没有超过10000个。解决方案是此jvm标志-XX:-MaxFDLimit

评论


空白空间不好,是吗?我在-XX:和-MaxFDLimit之间有一个空格,它不起作用。谢谢

– Coder-guy
20-10-1在14:01

#9 楼

您可以运行

lsof -n


,该进程打开太多文件。

然后杀死它。



sysctl -w kern.maxfiles=20480


将其更改为更大的一个。

评论


请说明该答案与已经给出的答案有何不同。

–斯蒂芬·劳赫(Stephen Rauch)
17年5月18日在3:30

#10 楼

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

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


评论


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

–music2myear
17年1月4日在21:11

#11 楼

我在运行Catalina的2017 Macbook上遇到此问题。问题是Spotify(是最新的)和Spotify设置“显示本地文件”。

此设置使Spotify可以浏览您的下载文件夹或其他文件夹,由于某种原因,它正在打开和检查但未关闭文件。检查lsof -n实际上是7500多个文件,其中包括成千上万个.jpg文件,因为我很长时间没有清理下载文件夹了。不确定为什么Spotify没有关闭它们,这似乎是一个错误。

禁用此设置并重新启动Spotify可能有效,或者只是卸载即可。

#12 楼

不应将增加授权文件的读取和写入视为一种好习惯。
如sanmai和许多人建议的那样,您可以简单地杀死一些压倒性的进程。
文件操作次数。
1- /步骤1检索最消耗文件的进程
lsof -n +c 0 | cut -f1 -d' ' | uniq -c | sort | tail

2- /步骤2使用这些名称杀死它们涉及的所有进程。
请注意不要系统地杀死任何消耗文件的进程,因为它可能对您当前的活动至关重要。
ps -e -a |grep file-consuming-process |for i in `awk {'print'}`; do kill -9 $i; done

玩得开心:)