目前,OS X 用户帐户的默认nofile
限制似乎约为 256 个文件描述符。我正在尝试测试一些需要同时打开比这多得多的连接数的软件。
在运行 pam 限制模块的典型 Debian 机器上,我会进行编辑/etc/security/limits.conf
以便为将要运行该软件的用户设置更高的限制,但我不知道在 OS X 中应该在哪里设置这些限制。
有没有 GUI 可以用于它?有没有配置文件可以用于它?在 OS X 上更改默认 ulimits 的最简洁方法是什么?
答案1
在 Leopard 下,初始进程是launchd
。每个进程的默认 ulimit 都继承自launchd
。作为参考,默认(编译时)限制是
$ 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
,参数与传递给命令的参数相同launchctl
。例如
echo "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.conf
但是launchd
已经启动了您的登录 shell,因此使这些更改生效的最简单方法是重新启动我们的机器。(使用 >> 附加到 /etc/launchd.conf。)
答案2
Shell 限制
可以通过命令更改 shell 和进程可用的资源ulimit
,这些命令可以添加到启动脚本中,例如~/.bashrc
或~/.bash_profile
针对个人用户或者/etc/bashrc
对于所有用户. 要添加的示例行:
ulimit -Sn 4096 && ulimit -Sl unlimited
请参阅:help ulimit
和man bash
了解更多信息。
系统限制
一般来说,系统限制由以下因素控制:已启动框架,可以通过命令更改launchctl
,例如
launchctl limit maxfiles 10240 unlimited
为了使更改持久化,您需要在特定的启动合规文件夹它充当启动代理。
以下是创建此类启动文件的示例命令:
sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.launchd.maxfiles.plist -c "add Label string com.launchd.maxfiles" -c "add ProgramArguments array" -c "add ProgramArguments: string launchctl" -c "add ProgramArguments: string limit" -c "add ProgramArguments: string maxfiles" -c "add ProgramArguments: string 10240" -c "add ProgramArguments: string unlimited" -c "add RunAtLoad bool true"
该文件将在系统启动时加载,但是,需要手动加载运行:
sudo launchctl load /Library/LaunchAgents/com.launchd.maxfiles.plist
要验证当前限制,请运行:launchctl limit
。
看:创建启动守护进程和代理。
内核限制
- 内核限制由命令控制
sysctl
。 - 要查看当前内核限制,请运行:
sysctl -a | grep ^kern.max
。 - 要更改允许打开的最大文件数量,请运行:
sudo sysctl -w kern.maxfiles=20480
。 - 为了使更改持久,请使用类似上述方法在系统启动文件夹中创建属性列表文件。
有关的:
已弃用的方法
在早期版本的 macOS 中,您可以/etc/sysctl.conf
像在 Unix 上一样在系统范围内设置这些限制,但是,似乎不支持。
使用~/.launchd.conf
或/etc/launchd.conf
似乎它也不受任何现有版本的 macOS 的支持。维基百科
与启动文件相同/etc/rc.local
,它不支持 macOS。
答案3
sudo echo "limit maxfiles 1024 unlimited" >> /etc/launchd.conf
不起作用,因为 sudo 放在了错误的位置,请尝试这个:
echo 'limit maxfiles 10000 unlimited' | sudo tee -a /etc/launchd.conf
答案4
% 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
%
现在我必须找出为什么存在两种检查/设置限制的方法......
好吧 - 看起来像是ulimit
,sysctl
给人一种假阳性的感觉,以为他们确实做了一些事情 - 但实际上他们似乎无用。有人可以证实这一点吗?
好的,我开始明白了。从 v10.4 开始,不再有init
进程,它已被替换launchd
,它也以 PID 1 运行。
% 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的程序。