如何在MAC OSX上限制程序的内存使用的示例

问题描述 投票:0回答:1

我正在阅读@AlexGray的this answer,它解释了如何在MAC OSX上限制进程的内存使用。

答案是:

您可以为您的可执行文件设置一个launchd项目.. plist的重要部分是一个部分,例如..

    <key>SoftResourceLimits</key> <dict>
       <key>Stack</key>
       <integer>10000000000</integer> 
    </dict> 

有各种各样的钥匙......可以在Apple's MAN page找到。

我不明白这个答案。我并不是真正意识到推出的项目是什么(虽然我现在读了一下),几乎不知道一个plist和一个键是什么,并且Apple-MAN页面的链接显得破碎。

您能否通过制作一个关于如何使用此解决方案的简单完全可重复的示例来帮助我?

bash macos memory-management launchd ulimit
1个回答
5
投票

(这可能不是一个很好的答案;它可能会让你走上正确的道路,但它可能不是足够的信息,甚至可能不可能。但它比你现在的信息更多。)

内存使用是一个复杂的主题。很难以精确的方式定义一个进程使用多少内存,因为它根本不清楚要计算哪些部分。例如,可执行文件本身通常是内存映射到磁盘,并使用相同的可执行文件在进程之间共享,在任何给定时间将各种部分分页到RAM中。这应该算作0字节,图像的整个大小,当前映射的页面大小,当前不可恢复的页面大小等等?当您进入虚拟(现在已压缩)内存的世界时,“此进程使用了​​多少内存?”变得更加模糊。

几年前在WWDC上,我向Apple询问如何对我自己的进程的资源使用进行绝对的限制。 (我想要这个,因为作为一个守护进程,我想确保我没有接管系统,即使这意味着我的服务已经死亡。)他们表示这不可能。我不知道这是否有所改变。

但是launchd可能有所帮助(也许它至少会记录一些东西)。该工具将是LaunchAgent。这些并不容易或有很好的记录。最好的文档是Daemons and Service Programming Guide

您将需要这些行的配置文件:

<?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>com.example.myproject</string>
    <key>ProgramArguments</key>
    <array>
        <string>path-to-executable</string>
        <string>any-parameter-if-needed</string>
    </array>
    <key>HardResourceLimits</key>
    <dict>
       <key>ResidentSetSize</key>
       <integer>10000000000</integer> 
    </dict>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>

有关详细信息,请参阅man launchd.plist。也许SoftResourceLimits会起作用。

该文件进入〜/ Library / LaunchAgents。 launchctl最近彻底改变了。你曾经不得不打电话给launchctl load,但它现在可以自动启动。请参阅launchctl kickstart作为让它运行的另一种方式。


(右... ulimit在OS X的现代版本上不起作用,所以下面所有内容都没用。)但是把所有这些放在一边,你想要的工具是ulimit,而不是启动。 (launchd非常复杂,文档记录很差,Apple最近完全重写了它的整个界面,所以很多旧的文档不再适用了)。

ulimit是bash的一部分。您可以使用它来约束各种资源的子进程。查看它们的最简单方法是ulimit -a

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 7168
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1418
virtual memory          (kbytes, -v) unlimited

您可能想要修改“数据段大小”或“虚拟内存”。例如,要将进程限制为1MB,可以在启动程序之前使用ulimit -d 1024

© www.soinside.com 2019 - 2024. All rights reserved.