如何在 Mac 上持续控制最大系统资源消耗?

How*_*ard 86 osx sysctl ulimit

在小牛队之前,我可以使用/etc/launchd.conf文件来改变最大系统资源消耗,例如:

limit maxfiles 16384 unlimited
limit maxproc 16384 unlimited
Run Code Online (Sandbox Code Playgroud)

它不再适用于小牛队。

在最新版本的 OS X 中,正确的做法是什么?

小智 92

外壳会话限制

通过设置的限制ulimit仅影响当前 shell 会话创建的进程。

  • “软限制”是实际使用的限制。可以设置,只要它不大于“硬限制”。
  • 也可以设置“硬限制”,但只能设置为小于当前值的值,并且只能设置为不小于“软限制”的值。
  • “硬限制”以及系统范围的限制可以由root(管理员)通过执行系统配置命令或修改系统配置文件来提高。

在您终止 shell 会话(通过Ctrl+ Dexit或关闭Terminal.app窗口等)后,设置将消失。如果您希望在下一个 shell 会话中使用相同的设置,请将设置添加到 shell 启动脚本中。

注意:如果您使用的是bash,那么它应该是~/.bash_proile~/.bash_login。如果您使用其他外壳,它可能应该是~/.profile.

系统限制(需要重启才能生效)

对于 10.9(小牛)、10.10(优胜美地)、10.11(埃尔卡皮坦)和 10.12(塞拉):

您必须在/Library/LaunchDaemons/limit.maxfiles.plist(owner: root:wheel, mode: 0644)创建一个文件:

<?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>262144</string>
      <string>524288</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
  </dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

您应该根据需要更改数字。它们分别是“软限制”(262144)和“硬限制”(524288)。有关更多信息,请通过运行查阅手册页man launchd.plist

对于 10.8(山狮):

您可以将以下几行添加到/etc/sysctl.conf(owner: root:wheel, mode: 0644):

kern.maxfiles=524288
kern.maxfilesperproc=262144
Run Code Online (Sandbox Code Playgroud)

您应该根据需要更改数字。它们分别是“系统范围限制” ( kern.maxfiles) 和“每个进程限制” ( kern.maxfilesperproc)。如需更多设置,请通过运行查阅手册页man sysctl,或阅读 处的源代码/usr/include/sys/sysctl.h

对于较旧的 Mac OS X(我猜它适用于 10.7 (Lion) 或更早版本):

您可以在/etc/launchd.conf(owner: root:wheel, mode: 0644) 中添加以下行:

limit maxfiles 262144 524288
Run Code Online (Sandbox Code Playgroud)

您应该根据需要更改数字。它们分别是“软限制”(262144)和“硬限制”(524288)。

如果系统不允许您将限制设置为高于某个值...

系统不允许您设置高于“硬最大值”(由 Apple 提出)的值。要增加这个“硬最大值”,您必须从“App Store”购买“OS X Server”,然后您必须执行以下命令一次:

sudo serverinfo --setperfmode true
Run Code Online (Sandbox Code Playgroud)

这会在您的机器上激活“服务器性能模式”。然后,您可以根据机器的配置设置最大值(请参阅此处)。我之前尝试过这个(在 Mountain 和 Mavericks 上)并且它有效!请参阅我的帖子(此处)了解更多信息。

参考

  • 我使用的是 10.9.5,但是当我运行 `ulimit -n` 时,只有 `/etc/launchd.conf` 方法显示任何效果。如果这很重要,有人可以更新说明吗? (2认同)

Kiw*_*iwy 11

似乎创建文件/etc/launchd.conf并将您的命令放入其中应该可以解决问题。


如果它不起作用,您可能可以编辑或创建该 /etc/rc.local文件并将您的命令添加到其中,因为 Apple 几乎不可能在命令行上删除对限制的支持。


编辑 1
我应该从那个开始,launchd 手册页 引用了以下文件:

  ~/Library/LaunchAgents         Per-user agents provided by the user.
  /Library/LaunchAgents          Per-user agents provided by the administrator.
  /Library/LaunchDaemons         System-wide daemons provided by the administrator.
  /System/Library/LaunchAgents   Per-user agents provided by Mac OS X.
  /System/Library/LaunchDaemons  System-wide daemons provided by Mac OS X.
Run Code Online (Sandbox Code Playgroud)

我敢打赌,您现在需要将命令~/Library/LaunchAgents放入/Library/LaunchDaemons.
你应该两个都试试。

编辑2
还要注意launchd需要xml文件而不仅仅是脚本。一个 gui 已经被设计来帮助完成这样的任务,一个不自由的人是Lingon。也许还有其他免费产品。


小智 9

我只是在我的.bash_profile
作品中添加了这两行,就像一个魅力

ulimit -n 1024
ulimit -u 1024
Run Code Online (Sandbox Code Playgroud)

  • 不影响系统限制。 (2认同)

ken*_*orb 9

系统限制

最近的 macOS 不再支持更改限制/etc/launchd.conf/etc/rc.local不再支持。请参阅:旧系统和技术

相反,您应该创建一个新的启动代理

这是使用PlistBuddy命令的命令示例(请参阅:)man PlistBuddy

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"
Run Code Online (Sandbox Code Playgroud)

maxproc极限类似:

sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.launchd.maxproc.plist \
-c "add Label string com.launchd.maxproc" \
-c "add ProgramArguments array" \
-c "add ProgramArguments: string launchctl" \
-c "add ProgramArguments: string limit" \
-c "add ProgramArguments: string maxproc" \
-c "add ProgramArguments: string 2000" \
-c "add ProgramArguments: string unlimited" \
-c "add RunAtLoad bool true"
Run Code Online (Sandbox Code Playgroud)

要装入上述文件,运行:sudo launchctl load /Library/LaunchAgents/com.launchd.*.plist

笔记:

  • 要打印文件,请运行:catPlistBuddy -x -c Print /Library/LaunchAgents/com.launchd.maxfiles.plist
  • 到负荷期间检查日志中的任何错误,运行:tail -f /var/log/system.log
  • 要查看当前launchd的限制,运行:launchctl limit
  • .plist文件可以放置在每个用户或系统范围的代理文件夹 ( LaunchAgents) 中。有关更多详细信息,请参阅:man launchdman launchd.plist,或这个那个答案。

内核限制

请注意,上述Launchd系统限制仍受内核限制,因此您不能将它们设置为高于内核状态变量中设置的实际限制(参见:man sysctl帮助)。

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

为了增加maxfiles限制,请运行:sudo sysctl -w kern.maxfiles=20480

为了让它们持久化,使用类似的方法创建一个启动.plist文件,例如

sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.kern.maxfiles.plist \
-c "add Label string com.kern.maxfiles" \
-c "add ProgramArguments array" \
-c "add ProgramArguments: string sysctl" \
-c "add ProgramArguments: string -w" \
-c "add ProgramArguments: string kern.maxfiles=20480" \
-c "add RunAtLoad bool true"
Run Code Online (Sandbox Code Playgroud)

壳牌限制

对于shell限制,添加相关ulimit命令到~/.bashrc~/.bash_profile启动文件为个人用户,或者/etc/bashrc为所有用户。请参阅:如何在 Mac 上添加持久外壳 ulimit 设置?

建议添加的行:

# Changes the ulimit limits.
ulimit -Sn 4096      # Increase open files.
ulimit -Sl unlimited # Increase max locked memory.
Run Code Online (Sandbox Code Playgroud)