hec*_*pal 32 memory macos virtual launchd ulimit
我的程序耗尽了内存,就像我运行它们的时间的一半.在Linux下,我可以使用ulimit -v mem-in-kbytes设置可用内存的硬限制.实际上,我使用ulimit -S -v mem-in-kbytes,所以我在程序中得到了正确的内存分配问题,我可以中止.
但是...... ulimit在OSX 10.6中不起作用.我尝试过使用-s和-m选项,但它们无法正常工作.
在2008年,MacRumors对同一个问题进行了一些讨论,但没有人提出一个好的选择.应该是一个程序可以学习它花费太多内存或通过操作系统设置限制的方式.
你不能。苹果可以(使用ledger()
系统调用,这是私有的),但你不能。我不完全确定 launchd 的选项是否有效 - 当然,如果它仍然使用上一个开源版本(从 10.9.5 开始)中可见的代码,它就不会,因为它调用setrlimit()
,但它已经被实质性重写了然后,虽然我看不到它调用ledger()
,但如果这应该起作用的话,我希望它会调用。
为什么?因为RLIMIT_DATA
和RLIMIT_AS
选项在当前版本的 XNU(macOS 内核)中setrlimit()
实际上没有执行任何操作。
在与自己挣扎之后(成功有限),我已经确定似乎有两种方法可以做到这一点......
您可以为您的可执行文件设置一个launchd项目.. plist的重要部分是一个部分,例如..
<key>SoftResourceLimits</key>
<dict>
<key>Stack</key>
<integer>10000000000</integer>
</dict>
Run Code Online (Sandbox Code Playgroud)
有各种可用的键......可以在Apple的MAN页面上找到.
我认为,另一种方法是在/etc/launchd.conf(system)或/etc/launchd-usr.conf(peruser)中设置一个值.例如,你的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
Run Code Online (Sandbox Code Playgroud)
如果你问我的话,所有launchd的功能的文档都很麻烦.就好像Apple可能不关心/希望人们能够真正了解它们的运作方式. 通过掌握launchd和它的复杂性,有很多权力 ......但是关于如何正确实施它们的具体/官方资源很少.