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


101

我正在尝试执行需要大量文件描述符的操作

sudo ulimit -n 12288达到了雪豹想走的高度 超出此结果

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

我想将数字提高很多,例如100000。有可能吗?


4
这个问题的答案在OSX Mavericks中不再起作用。
霍华德

2
echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.conf在Mavericks中为我运行和重新启动作品。

Answers:


95

使用ulimit命令仅更改当前外壳及其子外壳的资源限制,并sudo ulimit创建根外壳,调整其限制,然后退出(据我所知,这没有任何实际作用)。
要超过12288,您需要调整内核的参数kern.maxfileskern.maxfilesperproc参数,并且(至少根据此博客文章的内容,这是本次讨论的摘要)还需要调整启动限制。您可以使用launchctl limit一次调整所有这些:

sudo launchctl limit maxfiles 1000000 1000000

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

limit maxfiles 1000000 1000000

然后,您可以使用ulimit(但不使用sudo)调整流程限制。

如果这样做不行,则可能是内核的大小限制。如果您的模型支持它,则以64位模式引导内核可能会有所帮助。


1
sudo launchctl limit maxfiles 1000000 unlimited“ maxfiles”的硬性限制或软性限制都不是无限的。请同时使用数字参数。
Thomas Hunter

2
将该行添加到时要小心launchd.conf。我认为如果数量太少,可能会使您的计算机无法使用。例如,我曾经使用过,limit maxfiles 1024 1024并且很难将其改回。
肖恩2014年

1
las:“在早期启动期间,不再参考/etc/launchd.conf文件来运行子命令;出于安全考虑,已删除此功能。”
爱丽丝·珀赛尔

即使我成功设置ulimit -Sn 10240,我的fd数也不能超过6k。
健威航

@JianWeihang fd数字是每个进程的,因此我假设其他进程碰巧都打开了4000个文件。您碰巧运行Chrome吗?;)
Trejkaz

41

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

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

笔记:

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

3
las:“在早期启动期间,不再参考/etc/launchd.conf文件来运行子命令;出于安全考虑,已删除此功能。”
爱丽丝·珀赛尔

34

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

2
这个答案很好,我在这里找到了一些背景,@ ninjaPixel:blog.dekstroza.io/ulimit-shenanigans-on-osx-el-capitan
Dean Radcliffe

20

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

% sudo launchctl limit maxfiles 8192 unlimited
Neither the hard nor soft limit for "maxfiles" can be unlimited. Please use a numeric parameter for both.

提供软限制和硬限制的数值可以完成以下工作:

% sudo launchctl limit maxfiles 4096 8192

3
如果其中一个值是无限的,则将其-1用作值会导致12288。可以使用较大的数值,例如sudo launchctl limit maxfiles 15000 150000。不过,我不确定这些设置是否会起作用。
丹尼尔·贝克

8

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

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

2
考虑修改您的解决方案。您将ulimit设置为1024,然后将输出文件描述符显示为8192(应为1024)。如果没有sudo,您的方法也是冗长的,请尝试几次自行更改。
y3sh 2014年

1
sudo不应在此处使用,但此答案不正确。小牛用户应该使用echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.conf然后重新启动计算机
Kyle Chadha 2015年

3

OS X 10.13.6上,这对我有效:

$ sysctl kern.maxfiles
kern.maxfiles: 12288
$ sysctl kern.maxfilesperproc
kern.maxfilesperproc: 10240
$ sudo sysctl -w kern.maxfiles=1048600
kern.maxfiles: 12288 -> 1048600
$ sudo sysctl -w kern.maxfilesperproc=1048576
kern.maxfilesperproc: 10240 -> 1048576
$ ulimit -S -n
256
$ ulimit -S -n 1048576
$ ulimit -S -n
1048576

1

不能通过更改某些限制ulimit,因为它们仅适用于当前shell,因此launchctl应使用command全局更改限制,例如

sudo launchctl limit maxfiles 100000 unlimited

请注意,/etc/launchd.conf在最新的macOS版本中,不再支持将这些限制应用于(如其他答案中所建议的)。虽然仍然可以使用launchd.plist(见man launchd.plist),如每用户或系统范围内的plist配置文件,建议在这里那里,并在那里


要使这些限制持续存在,您可以使用/etc/sysctl.conffile并添加例如:

kern.maxprocperuid=1000
kern.maxproc=2000
kern.maxfilesperproc=20000
kern.maxfiles=50000

为了使更改生效,需要重新启动。

要查看当前限制,请运行:launchctl limitsysctl -a | grep ^kern.max

另请参阅:如何在macOS中保留ulimit设置?

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.