OS X用户帐户的默认nofile
限制似乎现在大约是256个文件描述符。 我试图testing一些软件,需要比一次打开更多的连接。
在运行pam限制模块的典型Debian框中,编辑/etc/security/limits.conf
为将要运行该软件的用户设置更高的限制,但是我很困惑在OS X中设置这些限制的位置。
有没有一个GUI的地方呢? 有没有一个configuration文件的地方? 什么是最简单的方法来改变OS X的默认限制?
在Leopard下,最初的过程已经launchd
。 每个进程的默认ulimits从launchd
inheritance。 作为参考默认(编译)的限制是
$ 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为什么有两种方法检查/设置限制….
好的 – 好像ulimit
和sysctl
给出了一个假阳性的感觉,他们实际上做了一些事情 – 但是相反,它们似乎是无用的 。 有人可以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
笔记:
在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或系统范围的plist
configuration文件,就像这里和这里所build议的那样。
要查看当前的限制,请运行: launchctl limit
或sysctl -a | grep ^kern.max
sysctl -a | grep ^kern.max
。
运行man sysctl.conf
或help ulimit
获得进一步的帮助。