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


85

在Mavericks之前,我可以使用/etc/launchd.conffile更改最大系统资源消耗,例如:

limit maxfiles 16384 unlimited
limit maxproc 16384 unlimited

它不再适用于小牛。

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


您的限制高于OS X的上限。maxfiles最高为10240,maxproc上限为1064。如果批准的答案固定了该限制,我会竖起大拇指..但它一直坐错地方,并且没有改正好了一年。现在..
Joey T

@atmosx:应该/etc/sysctl.conf,不是/etc/sysctrl.conf
小清庞-明日香贤治

1
@JoeyT:实际上您可以将其设置为更高的限制!但是,如果您使用的是Mac OS X 10.8(Mountain Lion)或10.9(Mavericks),则必须先从“ App Store”购买“ OS X Server”。(是的,您必须支付19.99美元才能更改设置!)简而言之,您必须运行sudo serverinfo --setperfmode true一次才能将计算机置于“服务器性能模式”。然后,您将获得“较高的最大值”,具体取决于您的计算机配置。有关详细信息,请参阅我的帖子在forums.apple.com/thread/5166397上。对于10.10(Yosemite),该模式默认情况下处于启用状态(至少在我的机器上!)。请参阅下面的答案。
小清庞-明日香健治

Answers:


87

Shell会话限制

通过设置的限制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(所有者:root:wheel,模式:)创建一个文件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>

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

对于10.8(山狮):

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

kern.maxfiles=524288
kern.maxfilesperproc=262144

您应该根据需要更改数字。它们分别是“系统范围的限制”(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

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

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

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

sudo serverinfo --setperfmode true

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

参考文献


1
谢谢; 我正在使用优胜美地,并且LaunchDaemon plist技术为我工作。我相信这是唯一的方法。对于需要此功能的任何人,请注意,重新启动才能生效
nc。

1
@nc。:在我的答案中添加了“需要重新启动才能生效”。我在该领域工作了太长时间,因此我不知道有些人不知道这一点。感谢您的提醒!
小清蓬-明日香贤治

2
我正在使用10.9.5,但只有这种/etc/launchd.conf方法在我运行时显示任何效果ulimit -n。如果重要的话,有人可以更新说明吗?
Sridhar Sarnobat,2015年

1
10.10优胜美地方法在10.11 El Capitan中也适用。尽管我无法将其设置为“无限”,所以我只能使用一个非常大的数字
antriver

1
@aolszowka:如何提高通过该限制,请参见本/etc/sysctl.confsuperuser.com/questions/827984/...
罗布·约翰森

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.

我敢打赌,您现在需要将命令放入~/Library/LaunchAgents或中/Library/LaunchDaemons
您应该同时尝试。

编辑2
还请注意,启动的需要xml文件,而不仅仅是脚本。一位gui一直致力于帮助这样的任务,一个不自由的人是Lingon。也许存在其他免费产品。


由于我的帖子中有很多信息,您能告诉我哪个是好消息吗?
2014年

请参阅下面的答案。
霍华德

在10.10及更高版本中,两者/etc/launchd.conf/etc/rc.local都将被忽略,因为在10.10中重新设计了启动版本,并删除了SystemStarter。
nisetama

@nise随时更新我的​​回答,如果最新版本的Mac OS中出现了新问题
Kiwy

10

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

ulimit -n 1024
ulimit -u 1024

2
不影响系统限制。
not2savvy

1
但是,如果您的系统限制足够高,那就可以了。要检查它们是什么,您只需运行即可ulimit -n -H。在macOS High Sierra上,unlimited这样做确实可以改变用户的“软”限制.bash_profile
约书亚·品特

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"

和类似的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"

要加载上述文件,请运行: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"

外壳极限

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

建议添加的行:

# Changes the ulimit limits.
ulimit -Sn 4096      # Increase open files.
ulimit -Sl unlimited # Increase max locked memory.

请特别注意,maxproc因为默认情况下,该参数的硬核限制为1064,这意味着将其设置为2000或“ unlimited”实际上仅将其设置为1064。不幸的是,内核不会强制执行该操作maxprocperuid < maxproc,并且您建议的设置将保留系统maxprocperuid=2000maxproc=1064这是危险的。在此处了解更多信息。
Old Pro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.