增加 Snow Leopard 中打开文件描述符的最大数量?

Chr*_*ole 107 mac osx-snow-leopard file-descriptors ulimit

我正在尝试做一些需要大量文件描述符的事情

sudo ulimit -n 12288像雪豹想去的一样高;超出这个结果

/usr/bin/ulimit:第 4 行:ulimit:打开文件:无法修改限制:无效参数。

我想把这个数字提高很多,比如 100000。这可能吗?

Gor*_*son 99

使用ulimitcommand 仅更改当前 shell 及其子级的资源限制,并sudo ulimit创建一个 root shell,调整其限制,然后退出(因此,据我所知,没有实际影响)。
要超过 12288,您需要调整内核kern.maxfileskern.maxfilesperproc参数,以及(至少根据此博客条目,这是本讨论的摘要)启动限制。您可以使用launchctl limit一次调整所有这些:

sudo launchctl limit maxfiles 1000000 1000000
Run Code Online (Sandbox Code Playgroud)

要使其永久化(即在重新启动时不重置),请创建/etc/launchd.conf包含:

limit maxfiles 1000000 1000000
Run Code Online (Sandbox Code Playgroud)

然后您可以使用ulimit(但不使用sudo)来调整您的进程限制。

如果没有这样做,您可能会遇到内核中的大小限制。如果您的型号支持,以64 位模式启动内核可能会有所帮助。

  • 将该行添加到 `launchd.conf` 时要小心。我认为如果数字太小,它会使您的计算机无法使用。例如,我使用了`limit maxfiles 1024 1024`,我很难把它改回来。 (3认同)
  • 唉:“在早期启动期间,不再参考 /etc/launchd.conf 文件来运行子命令;出于安全考虑,此功能已被删除。” (3认同)

小智 42

以下应该解决大多数解决方案(并按其层次结构顺序列出):

echo 'kern.maxfiles=20480' | sudo tee -a /etc/sysctl.conf
echo -e 'limit maxfiles 8192 20480\nlimit maxproc 1000 2000' | sudo tee -a /etc/launchd.conf
echo 'ulimit -n 4096' | sudo tee -a /etc/profile
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 您需要重新启动这些更改才能生效。
  2. AFAIK 您不能再在 OS X 下将限制设置为“无限制”
  3. launchctl maxfiles 受 sysctl maxfiles 限制,因此不能超过它们
  4. sysctl 似乎从 launchctl maxfiles 继承了 kern.maxfilesperproc
  5. ulimit 似乎默认从 launchctl 继承它的“打开文件”值
  6. 您可以在 /etc/profile 或 ~/.profile 中设置自定义 ulimit ;虽然这不是必需的,但我提供了一个例子
  7. 与默认值相比,将这些值中的任何一个设置为非常高的数字时要小心 - 功能存在稳定性/安全性。我采用了这些我认为合理的示例数字,这些数字是写在其他网站上的。

  • 唉:“在早期启动期间,子命令运行不再参考 /etc/launchd.conf 文件;出于安全考虑,此功能已被删除。” (3认同)

小智 39

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

  • 这个答案很棒,我在这里找到了一些背景,@ninjaPixel:http://blog.dekstroza.io/ulimit-shenanigans-on-osx-el-capitan/ (2认同)

小智 21

似乎 OS X Lion 不允许将“无限”作为值:

% sudo launchctl limit maxfiles 8192 unlimited
Neither the hard nor soft limit for "maxfiles" can be unlimited. Please use a numeric parameter for both.
Run Code Online (Sandbox Code Playgroud)

为软限制和硬限制提供数值可以完成这项工作:

% sudo launchctl limit maxfiles 4096 8192
Run Code Online (Sandbox Code Playgroud)

  • 如果其中一个值是 *unlimited*,则使用 `-1` 作为值会导致 `12288`。可以使用更大的数值,例如`sudo launchctl limit maxfiles 15000 150000`。不过,我不确定这些设置是否会产生影响。 (3认同)

Clu*_*net 9

在小牛队上很简单。作为普通用户:

ulimit -n 8192

您可以通过以下方式检查更新的设置

ulimit -a

在我的机器上:

ulimit -a
-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         0
-v: address space (kbytes)          unlimited
-l: locked-in-memory size (kbytes)  unlimited
-u: processes                       709
-n: file descriptors                8192
Run Code Online (Sandbox Code Playgroud)

  • 考虑修改您的解决方案。您将 ulimit 设置为 1024,然后将输出文件描述符显示为 8192(应该是 1024)。您的方法在没有 sudo 的情况下也是有问题的,请尝试为自己更改几次。 (2认同)