OS X(10.5)中指定的默认限制在哪里?

OS X用户帐户的默认nofile限制似乎现在大约是256个文件描述符。 我试图testing一些软件,需要比一次打开更多的连接。

在运行pam限制模块的典型Debian框中,编辑/etc/security/limits.conf为将要运行该软件的用户设置更高的限制,但是我很困惑在OS X中设置这些限制的位置。

有没有一个GUI的地方呢? 有没有一个configuration文件的地方? 什么是最简单的方法来改变OS X的默认限制?

在Leopard下,最初的过程已经launchd 。 每个进程的默认ulimits从launchdinheritance。 作为参考默认(编译)的限制是

 $ sudo launchctl limit cpu unlimited unlimited filesize unlimited unlimited data 6291456 unlimited stack 8388608 67104768 core 0 unlimited rss unlimited unlimited memlock unlimited unlimited maxproc 266 532 maxfiles 256 unlimited 

要更改这些限制,可以在/etc/launchd.conf添加一行(您可能需要首先创build文件),参数与传递给launchctl命令的参数相同。 例如

 echo "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.conf 

但是launchd已经启动了您的loginshell,因此使这些更改生效的最简单方法是重启我们的机器。 (使用>>附加到/etc/launchd.conf。)

 sudo echo "limit maxfiles 1024 unlimited" >> /etc/launchd.conf 

不工作,因为sudo是在错误的地方,试试这个:

 echo 'limit maxfiles 10000 unlimited' | sudo tee -a /etc/launchd.conf 
 % ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) 6144 file size (blocks, -f) unlimited max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 2560 pipe size (512 bytes, -p) 1 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 266 virtual memory (kbytes, -v) unlimited % 

现在我必须find为什么有两种方法检查/设置限制….


好的 – 好像ulimitsysctl给出了一个假阳性的感觉,他们实际上做了一些事情 – 但是相反,它们似乎是无用的 。 有人可以validation吗?


好吧,我开始明白了。 从v10.4开始,不再有init进程,它已经被launchd所取代,它也以1的PID运行。

 % ps -fu root UID PID PPID C STIME TTY TIME CMD 0 1 0 0 0:30.72 ?? 0:46.72 /sbin/launchd 

当然值得一提的是, ulimit是一个内置的shell, launchctl是一个独立于shell的程序。

以下内容应解决大多数解决scheme(并按其层次结构排列):

 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 maxfiles由sysctl maxfiles限制,因此不能超过它们
  4. sysctl似乎从launchctl maxfilesinheritancekern.maxfilesperproc
  5. ulimit默认情况下似乎从launchctlinheritance它的“打开文件”值
  6. 您可以在/ etc / profile或〜/ .profile中设置自定义的ulimit; 虽然这不是必需的,我已经提供了一个例子
  7. 与其默认值相比,将这些值中的任何一个值设置为非常高的值时要谨慎 – 特征存在稳定性/安全性。 我已经拿到了这些数字,我认为是合理的,写在其他网站上。
  8. 当launchctl的限制低于sysctl的时候,有报告说相关的sysctl会自动碰撞以满足要求。

在OS X上,如果试图修改守护进程或进程或任务的软限制,更改这些软限制的正确方法不是通过更改所有进程的默认启动configuration,而是通过为进程设置它试图跑步。

这是在您启动的.plist文件中完成的。

如果你有一个守护进程或进程运行,你需要有更多的打开的文件,为它创build一个plist文件,并添加这些参数:

  <key>SoftResourceLimits</key> <dict> <key>NumberOfFiles</key> <integer>1024</integer> </dict> 

一个例子,使用mongodb。 我创build了一个名为org.mongo.mongodb.plist的.plist文件,并将其保存到/Library/LaunchDaemons/org.mongo.mongodb.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>Disabled</key> <false/> <key>Label</key> <string>org.mongo.mongod</string> <key>ProgramArguments</key> <array> <string>/usr/local/lib/mongodb/bin/mongod</string> <string>--dbpath</string> <string>/Users/Shared/mongodata/</string> <string>--logpath</string> <string>/var/log/mongodb.log</string> </array> <key>QueueDirectories</key> <array/> <key>RunAtLoad</key> <true/> <key>UserName</key> <string>daemon</string> <key>SoftResourceLimits</key> <dict> <key>NumberOfFiles</key> <integer>1024</integer> <key>NumberOfProcesses</key> <integer>512</integer> </dict> </dict> </plist> 

现在,您的stream程拥有了所需的资源,而不需要使用系统的全局configuration。 这将在重启时自动设置。 或者,如果您不想重新启动,则可以运行

 sudo launchctl load /Library/LaunchDaemons/org.mongod.plist 

如果你的进程或任务更像是一个守护进程而不是一个守护进程,你可以把.plist放在/ Library / LaunchAgents中。 在这两种情况下,不同的规则都适用于launchd如何控制你的过程。 LaunchDaemons似乎是保留在启动的任何时候都会保持的进程。

我的经验是,我的高stream程任务只能成功:

 kern.maxproc=2500 # This is as big as I could set it. kern.maxprocperuid=2048 ulimit -u 2048 

前两个可以进入/etc/sysctl.conf ,并将ulimit的值放入launchd.conf中,进行可靠的设置。

由于tcp / ip是我正在做的事情的一部分,我也需要碰撞

 kern.ipc.somaxconn=8192 

从默认的128。

在我增加了stream程限制之前,我得到了“分叉”失败,没有足够的资源。 在我增加kern.ipc.somaxconn之前,我得到了“破pipe”的错误。

这是在我的怪兽Mac OS 10.5.7,然后10.5.8,现在10.6.1运行一个相当数量(500-4000)的分离进程。 在我的老板的电脑上的Linux下,它工作。

我认为进程的数量将接近1000,但似乎我开始的每个进程都包含了自己的shell的副本,除了实际的项目做实际的工作。 非常喜庆。

我写了一个显示玩具,就像这样:

 #!/bin/sh while[ 1 ] do n=netstat -an | wc -l nw=netstat -an | grep WAIT | wc -l p=ps -ef | wc -l psh=ps -ef | fgrep sh | wc -l echo "netstat: $n wait: $nw ps: $p sh: $psh" sleep 0.5 done 

并观察了ps -ef中进程的最大数量,并在netstat中等待TIME_WAIT过期…随着限制的提高,我看到了3500多个TIME_WAIT项目在高峰期。

在我提出限制之前,我可以偷偷摸摸地看到失败的门槛,这个门槛从1K开始,但是上升到了1190的高数值。每当它被推入失败,下一次可能会多一点,可能是因为某些事情caching,每次失败时扩展到极限。

尽pipe我的testing用例最终是以“等待”的forms出现的,但是在退出之后仍然有很多独立的进程在进行。

我从互联网上发布的信息中获得了大部分信息,但并非全部都是准确的。 你的milage可能会有所不同。

您可以在/etc/sysctl.conf系统范围内设置这些限制,例如

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

要进行更改才能生效,需要重新启动。

请注意,在最近的macOS版本中不再支持在/etc/launchd.conf中应用更改(如其他答案中的build议)。 虽然仍然可以使用launchd.plist (请参阅: man launchd.plist ),例如per-user或系统范围的plistconfiguration文件,就像这里和这里所build议的那样。

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

运行man sysctl.confhelp ulimit获得进一步的帮助。