OS X 10.7.1 上的“系统中打开的文件太多”错误是否有修复?

Joh*_*und 238 macos

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

有办法吗?

Nat*_*ong 261

根据这篇有用的文章(我推荐阅读):

默认情况下,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
Run Code Online (Sandbox Code Playgroud)

注意:在 OS X 10.10 或更低版本中,您可以在/etc/launchd.conflike添加设置limit maxfiles,它会覆盖您在此处放置的任何内容。

再次,从文章:

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

该命令是:

ulimit -S -n 2048 # or whatever number you choose
Run Code Online (Sandbox Code Playgroud)

这种变化也是暂时的;它只持续当前的 shell 会话。如果您希望它在每次打开 shell 时都运行.bashrc,您可以将它添加到您的 shell 配置文件(.zshrc或其他)中。

  • 如果有人遇到 max files 不粘连的问题,那是因为 maxfiles 行后面有一个尾随空格,需要删除。 (3认同)

小智 73

似乎有一种完全不同的方法来更改每个 OS X 版本的打开文件限制!

对于 OS X Sierra (10.12.X),您需要:

1. 创建一个文件at/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> 
Run Code Online (Sandbox Code Playgroud)

2. 更改新文件的所有者:

sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist
Run Code Online (Sandbox Code Playgroud)

3. 加载这些新设置:

sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist
Run Code Online (Sandbox Code Playgroud)

4. 最后,检查限制是否正确:

launchctl limit maxfiles
Run Code Online (Sandbox Code Playgroud)


san*_*mai 45

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

sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
Run Code Online (Sandbox Code Playgroud)

对于最后一个,您可以看到打开了哪些文件:

sudo lsof -n | grep socketfil
Run Code Online (Sandbox Code Playgroud)

并根据需要终止进程

kill $pid
Run Code Online (Sandbox Code Playgroud)

来自评论:

对于它的价值,您还可以使用

lsof -n +c 0 | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail
Run Code Online (Sandbox Code Playgroud)

  • 使用“lsof -n +c 0”来防止截断进程名称。 (2认同)

Ada*_*m C 37

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

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

launchctl limit maxfiles
Run Code Online (Sandbox Code Playgroud)

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

  • 256 在 OS X Yosemite 上也是如此 (4认同)
  • 256?对我来说有 2560 个文件描述符,而且我从未更改过它。限制为 266 个进程(参见“ulimit -a”)。 (2认同)
  • 对我来说也是一样,MacOS X Maverick 上有 256 个文件 (2认同)
  • El Capitan 也有 256 路。 (2认同)

Clu*_*net 12

伙计们,在小牛队 10.9.4

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


小智 6

对于最新的 macOS(在撰写本文时:10.14.1),您可以使用sudo launchctl limit maxfiles 64000 524288(默认为 256),但它只能在当前会话中使用。使用launchctl来自 @ninjaPixel ( https://superuser.com/a/1171028/760235 ) 的工作来永久解决。


ang*_*okh 5

类似于https://superuser.com/a/1171028/367819

要检查 Mac OS X 系统的当前限制,请运行:

launchctl limit maxfiles
Run Code Online (Sandbox Code Playgroud)

最后两列分别是软限制和硬限制。

要在 Mac OS X Yosemite 中调整系统范围内的打开文件限制,您必须创建两个配置文件。第一个是 /Library/LaunchDaemons/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>
Run Code Online (Sandbox Code Playgroud)

这会将打开文件限制设置为 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>
Run Code Online (Sandbox Code Playgroud)

两个 plist 文件都必须由 root:wheel 所有并具有 -rw-r--r-- 权限。默认情况下,此权限应已就位,但您可以通过运行 sudo chmod 644 确保它们已就位。虽然上述步骤将导致在重新启动时正确设置系统范围的打开文件限制,但您可以通过运行 launchctl limit 手动应用它们。

除了在系统级别设置这些限制之外,我们还建议通过将以下行附加到 bashrc、bashprofile 或类似文件来在会话级别进行设置:

ulimit -n 200000
ulimit -u 2048
Run Code Online (Sandbox Code Playgroud)

与 plist 文件一样,您的 bashrc 或类似文件应该具有 -rw-r--r-- 权限。此时,您可以重新启动计算机并在终端中输入 ulimit -n。如果您的系统配置正确,您应该看到 maxfiles 已设置为 200000。


您可以关注这篇文章了解更多详情。

https://gist.github.com/tombigel/d503800a282fcadbee14b537735d202c


请记住重新启动 Mac 以使这些值生效。