archaelus Asked: 2009-05-31 05:09:36 +0800 CST2009-05-31 05:09:36 +0800 CST 2009-05-31 05:09:36 +0800 CST OS X (10.5) 上指定的默认 ulimit 在哪里? 772 如今,OS X 用户帐户的默认nofile限制似乎是大约 256 个文件描述符。我正在尝试测试一些需要比一次打开更多连接的软件。 在运行 pam 限制模块的典型 Debian 机器上,我会编辑/etc/security/limits.conf为将运行该软件的用户设置更高的限制,但我很困惑在 OS X 中在哪里设置这些限制。 它的某个地方有GUI吗?在某处有配置文件吗?在 OS X 上更改默认 ulimit 的最简洁方法是什么? mac-osx ulimit 7 个回答 Voted Best Answer Dave Cheney 2009-05-31T05:24:28+08:002009-05-31T05:24:28+08:00 在 Leopard 下,初始过程是launchd. 每个进程的默认 ulimits 继承自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。) kenorb 2017-07-30T05:48:47+08:002017-07-30T05:48:47+08:00 壳牌限制 可用于 shell 和进程的资源可以通过添加到启动脚本的命令进行更改,例如ulimit单个用户~/.bashrc或~/.bash_profile/etc/bashrc所有用户。要添加的示例行: ulimit -Sn 4096 && ulimit -Sl unlimited 请参阅:help ulimit以及man bash更多信息。 系统限制 一般来说,系统限制是由Launchd框架控制的,可以通过launchctl命令来改变,例如 launchctl limit maxfiles 10240 unlimited 要使更改持久化,您需要在特定的Launch 兼容文件夹中创建一个属性列表文件,该文件夹充当启动代理。 以下是创建此类启动文件的示例命令: 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. 要使更改持久化,请使用与上述类似的方法在系统启动文件夹中创建属性列表文件。 有关的: 如何在 Mac 上持续控制最大系统资源消耗? 哪个命令控制打开文件的限制? 已弃用的方法 在早期版本的 macOS 中,您可以/etc/sysctl.conf像在 Unix 上一样在系统范围内设置这些限制,但是,它似乎不受支持。 使用~/.launchd.conf或/etc/launchd.conf似乎在任何现有版本的 macOS 中也不支持。维基 与/etc/rc.local启动文件相同,macOS 不支持。 andi 2013-03-08T22:55:48+08:002013-03-08T22:55:48+08:00 sudo echo "limit maxfiles 1024 unlimited" >> /etc/launchd.conf 不起作用,因为 sudo 在错误的位置,试试这个: echo 'limit maxfiles 10000 unlimited' | sudo tee -a /etc/launchd.conf apotek 2013-08-01T09:36:42+08:002013-08-01T09:36:42+08:00 在 OS X 上,如果您尝试修改守护程序或进程或任务的软限制,更改这些软限制的正确方法不是更改所有进程的默认启动配置,而是为您所在的进程设置它试图跑。 这是在您的进程的launchd .plist 文件中完成的。 如果您有一个守护进程或进程正在运行,您需要为其打开更多文件,请为其创建一个 plist 文件并将这些参数添加到其中: <key>SoftResourceLimits</key> <dict> <key>NumberOfFiles</key> <integer>1024</integer> </dict> 一个例子,使用 mongodb。我创建了一个名为 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> 现在您的进程拥有了它需要的资源,而无需与系统的全局配置混为一谈。这将在重新启动时自动设置。或者,如果您不想重新启动,您可以运行 sudo launchctl load /Library/LaunchDaemons/org.mongod.plist 如果您的进程或任务更像是代理而不是守护进程,则可以将 .plist 放在 /Library/LaunchAgents 中。在这两种情况下,不同的规则适用于 launchd 如何控制您的进程。LaunchDaemons 似乎保留给 launchd 将始终尝试跟上的进程。 Xerxes 2009-05-31T06:18:37+08:002009-05-31T06:18:37+08:00 % 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的程序。 Bil Abbott 2009-10-23T16:47:31+08:002009-10-23T16:47:31+08:00 我的经验是,我的高进程计数任务只成功了: 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 开始。 在我增加进程限制之前,我遇到了“fork”失败,没有足够的资源。在我增加 kern.ipc.somaxconn 之前,我遇到了“断管”错误。 这是在我的怪物 Mac 上运行相当数量(500-4000)的分离进程时,OS 10.5.7,然后是 10.5.8,现在是 10.6.1。在我老板的计算机上的 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 的高值。每次它被推入失败时,下一次可能需要更多时间,可能是因为某些原因缓存每次失败时都会扩展到其极限。 尽管我的测试用例有一个“等待”作为它的最终语句,但在它退出后仍然有大量分离的进程在附近徘徊。 我从互联网上的帖子中获得了我使用的大部分信息,但并非所有信息都是准确的。您的里程可能会有所不同。 errant.info 2012-12-04T04:13:41+08:002012-12-04T04:13:41+08:00 以下应该解决大多数解决方案(并按其层次结构顺序列出): 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 笔记: 您需要重新启动才能使这些更改生效。 AFAIK,您不能再在 OS X 下将限制设置为“无限制” launchctl maxfiles 受 sysctl maxfiles 限制,因此不能超过它们 sysctl 似乎从 launchctl maxfiles 继承了 kern.maxfilesperproc 默认情况下,ulimit 似乎从 launchctl 继承了它的“打开文件”值 您可以在 /etc/profile 或 ~/.profile 中设置自定义 ulimit;虽然这不是必需的,但我提供了一个示例 与默认值相比,将这些值中的任何一个设置为非常高的数字时要小心 - 这些功能存在稳定性/安全性。我已将这些我认为合理的示例数字写在其他网站上。 当 launchctl 限制低于 sysctl 限制时,有报道称相关 sysctl 限制会自动增加以满足要求。
在 Leopard 下,初始过程是
launchd
. 每个进程的默认 ulimits 继承自launchd
. 作为参考,默认(编译)限制是要更改任何这些限制,请在 中添加一行(您可能需要先创建文件) ,参数与传递给命令
/etc/launchd.conf
的参数相同。launchctl
例如但是
launchd
已经启动了你的登录 shell,所以让这些更改生效的最简单方法是重新启动我们的机器。(使用 >> 附加到 /etc/launchd.conf。)壳牌限制
可用于 shell 和进程的资源可以通过添加到启动脚本的命令进行更改,例如
ulimit
单个用户~/.bashrc
或~/.bash_profile
/etc/bashrc
所有用户。要添加的示例行:请参阅:
help ulimit
以及man bash
更多信息。系统限制
一般来说,系统限制是由Launchd框架控制的,可以通过
launchctl
命令来改变,例如要使更改持久化,您需要在特定的Launch 兼容文件夹中创建一个属性列表文件,该文件夹充当启动代理。
以下是创建此类启动文件的示例命令:
该文件将在系统启动时加载,但是,加载以手动运行:
要验证当前限制,请运行:
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 不支持。不起作用,因为 sudo 在错误的位置,试试这个:
在 OS X 上,如果您尝试修改守护程序或进程或任务的软限制,更改这些软限制的正确方法不是更改所有进程的默认启动配置,而是为您所在的进程设置它试图跑。
这是在您的进程的launchd .plist 文件中完成的。
如果您有一个守护进程或进程正在运行,您需要为其打开更多文件,请为其创建一个 plist 文件并将这些参数添加到其中:
一个例子,使用 mongodb。我创建了一个名为 org.mongo.mongodb.plist 的 .plist 文件,并将其保存到 /Library/LaunchDaemons/org.mongo.mongodb.plist。该文件如下所示:
现在您的进程拥有了它需要的资源,而无需与系统的全局配置混为一谈。这将在重新启动时自动设置。或者,如果您不想重新启动,您可以运行
如果您的进程或任务更像是代理而不是守护进程,则可以将 .plist 放在 /Library/LaunchAgents 中。在这两种情况下,不同的规则适用于 launchd 如何控制您的进程。LaunchDaemons 似乎保留给 launchd 将始终尝试跟上的进程。
现在我必须找出为什么存在两种检查/设置限制的方法......
好的 - 似乎
ulimit
并sysctl
给出了他们实际上在做某事的假阳性感觉 - 但相反,它们似乎没用。有人可以验证吗?好吧,我开始明白了。从 v10.4 开始,
init
不再有进程,它已被替换为launchd
,它也以 PID 为 1 运行。而且当然值得一提的是,它
ulimit
是一个shell内置的,launchctl
是一个独立于shell的程序。我的经验是,我的高进程计数任务只成功了:
前两个可以进入
/etc/sysctl.conf
,ulimit 值进入launchd.conf,进行可靠设置。由于 tcp/ip 是我正在做的事情的一部分,我还需要提升
从默认的 128 开始。
在我增加进程限制之前,我遇到了“fork”失败,没有足够的资源。在我增加 kern.ipc.somaxconn 之前,我遇到了“断管”错误。
这是在我的怪物 Mac 上运行相当数量(500-4000)的分离进程时,OS 10.5.7,然后是 10.5.8,现在是 10.6.1。在我老板的计算机上的 Linux 下,它可以正常工作。
我认为进程的数量会接近 1000,但似乎我开始的每个进程都包括自己的 shell 副本,以及执行实际工作的实际项目。非常喜庆。
我写了一个展示玩具,类似于:
并观察了 ps -ef 中的最大进程数,并在 netstat 中等待
TIME_WAIT
过期......随着限制的提高,我看到了 3500 多个TIME_WAIT
项目的峰值。在我提高限制之前,我可以“潜入”失败阈值,该阈值开始时低于 1K,但上升到 1190 的高值。每次它被推入失败时,下一次可能需要更多时间,可能是因为某些原因缓存每次失败时都会扩展到其极限。
尽管我的测试用例有一个“等待”作为它的最终语句,但在它退出后仍然有大量分离的进程在附近徘徊。
我从互联网上的帖子中获得了我使用的大部分信息,但并非所有信息都是准确的。您的里程可能会有所不同。
以下应该解决大多数解决方案(并按其层次结构顺序列出):
笔记: