【问题标题】:How to limit memory of a OS X program? ulimit -v neither -m are working如何限制 OS X 程序的内存? ulimit -v 都不 -m 工作
【发布时间】:2011-03-17 12:09:31
【问题描述】:

我的程序在我运行它们的一半时间里都会耗尽内存。在 Linux 下,我可以使用 ulimit -v mem-in-kbytes 设置可用内存的硬限制。实际上,我使用的是ulimit -S -v mem-in-kbytes,所以我在程序中遇到了正确的内存分配问题,我可以中止。

但是... ulimit 在 OSX 10.6 中不起作用。我已经尝试使用 -s 和 -m 选项,但它们不起作用。

在 2008 年,MacRumors 曾讨论过同样的问题,但没有人提出好的替代方案。这应该是程序可以了解它消耗过多内存或通过操作系统设置限制的一种方式。

【问题讨论】:

  • 补充一点,我似乎也无法使用setrlimit 使用 RLIMIT_RSS、RLIMIT_DATA、RLIMIT_AS 或(到达此处)RLIMIT_STACK 中的任何一个。
  • 就目前而言,赏金将不予奖励。

标签: macos memory virtual launchd ulimit


【解决方案1】:

你不能。苹果可以(使用ledger() 系统调用,这是私有的),但你不能。我不完全确定 launchd 的选项是否有效——当然,如果它仍在使用上一个开源版本(从 10.9.5 开始)中可见的代码,它不会,因为它调用 setrlimit(),但它一直从那时起进行了大量重写,虽然我看不到它调用ledger(),如果这应该工作的话,我希望它会这样做。

为什么?因为setrlimit()RLIMIT_DATARLIMIT_AS 选项实际上在当前版本的XNU(macOS 内核)中任何事情。

【讨论】:

    【解决方案2】:

    在自己为此苦苦挣扎(成功有限)之后,我确定似乎有两种方法可以做到这一点......

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

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

    有各种可用的密钥...可以在 Apple's MAN page 上找到。

    另一种方法,我认为,是在 /etc/launchd.conf(系统)或 /etc/launchd 中设置一个值-usr.conf(细读)。例如,您的 launchd.conf 可能包含...

    umask 002
    limit stack 67104768 67104768
    limit maxproc 3400 4500
    limit maxfiles 256 unlimited
    setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
    

    如果你问我,launchd 的所有功能的文档都是很短的。就好像 Apple 可能不关心/不希望人们在他们的墙外真正了解它是如何工作的。 There is so much power 是通过掌握 launchd 获得的,它很复杂......但是关于如何正确实施它们的具体/官方资源很少。

    【讨论】:

    • +1 我面对的是launchd,我不能放手。如果它以任何一致的方式工作,我会一直使用它。
    【解决方案3】:

    setrlimit 应该可以完成这项工作。我相信这是ulimit的BSD等价物...

    【讨论】:

    • 我查看了setrlimit 的手册页,虽然您可以设置物理内存限制,但看不到如何设置虚拟内存限制。
    • 我知道bash ulimit是直接调用setrlimit实现的。在 Linux 手册页中有选项 RLIMIT_AS,它限制了“进程的虚拟内存(地址空间)的最大大小(以字节为单位)”,这就是我想要控制的。我真的不在乎物理内存的限制。我想知道整个程序何时超过 2Gb。好吧,在 setrlimit 的 OS X 手册页上,有 RLIMIT_AS。最接近的是 RLIMIT_RSS。事实上,鉴于我在活动监视器中看到的情况,恕我直言 OS X 似乎分配了很多虚拟内存。
    • 嗯...SUSv3 需要RLIMIT_AS,(请参阅opengroup.org/onlinepubs/009695399/functions/getrlimit.html)并且OS X 作为SUSv3 UNIX 出售,所以它应该支持RLIMIT_AS。实际上&lt;sys/resource.h&gt; 定义了RLIMIT_AS,尽管手册页中没有提到它。可以试试RLIMIT_AS 看看是否真的实现了吗?
    • 看来我应该试试...谢谢。
    • 互联网上有各种报道称setrlimit 在 Darwin (OS X) 上完全崩溃了。 lists.apple.com/archives/Unix-porting/2007/Apr/msg00026.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 2023-03-09
    • 2011-10-09
    • 2012-08-29
    • 2015-01-24
    • 2014-03-15
    相关资源
    最近更新 更多