Как ограничить память программы OS X? ulimit -v ни -m не работают

Моим программам не хватает памяти примерно в половине случаев, когда я их запускаю. В Linux я могу установить жесткое ограничение на доступную память, используя ulimit -v mem-in-kbytes. На самом деле, я использую ulimit -S -v mem-in-kbytes, поэтому у меня возникает проблема с правильным распределением памяти в программе, и я могу прервать ее.

Но... ulimit не работает в OSX 10.6. Я пробовал с параметрами -s и -m, и они не работают.

В 2008 г. эта же проблема обсуждалась в MacRumors, но никто не предложил хорошая альтернатива. Должен быть способ, которым программа может узнать, что она тратит слишком много памяти или устанавливает ограничение через ОС.


person hectorpal    schedule 18.07.2010    source источник
comment
Чтобы добавить к этому, я, похоже, не могу заставить его работать с setrlimit, с любым из RLIMIT_RSS, RLIMIT_DATA, RLIMIT_AS или (здесь) RLIMIT_STACK.   -  person Paul Biggar    schedule 28.12.2010
comment
В нынешнем виде награда не будет присуждена.   -  person Paul Biggar    schedule 04.01.2011


Ответы (3)


После того, как я сам с этим боролся (с ограниченным успехом), я решил, что есть два способа сделать это...

Вы можете настроить элемент запуска для своего исполняемого файла. Важной частью plist является раздел, например..

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

Доступны различные ключи... которые можно найти на странице страница MAN Apple.

Другой способ сделать это, я думаю, — установить значение либо в /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 может не заботиться / хотеть, чтобы люди за пределами их стен действительно понимали, как все это работает. Освоение launchd и его тонкостей дает так много возможностей... но мало конкретных /официальные ресурсы о том, как их правильно реализовать.

person Alex Gray    schedule 29.05.2011
comment
+1 Я против launchd и не могу отпустить его. Если бы это работало каким-то последовательным образом, я бы использовал его все время. - person chiggsy; 24.07.2011

Вы не можете. Apple может (используя системный вызов ledger(), который является закрытым), но вы не можете. Я не совсем уверен, работают ли параметры launchd или нет - конечно, если бы он все еще использовал код, видимый в последней версии с открытым исходным кодом (из 10.9.5), он бы не работал, потому что он вызывает setrlimit(), но он был существенно переписан с тех пор, хотя я не вижу, чтобы он вызывал ledger(), чего я ожидал бы, если бы это должно было работать.

Почему? Потому что параметры RLIMIT_DATA и RLIMIT_AS для setrlimit() на самом деле ничего не делают в текущих версиях XNU (ядра macOS).

person alastair    schedule 05.05.2020

setrlimit должен выполнить эту работу. Я считаю, что это эквивалент BSD ulimit...

person Yuji    schedule 18.07.2010
comment
Я просмотрел справочную страницу для setrlimit и не смог понять, как установить ограничение на виртуальную память, хотя вы можете установить ограничение на физическую память. - person JWWalker; 19.07.2010
comment
Я знаю, что bash ulimit реализован напрямую, вызывая setrlimit. В man-странице Linux есть параметр RLIMIT_AS, который ограничивает максимальный размер виртуальной памяти (адресного пространства) процесса в байтах, это то, что я хочу контролировать. Я действительно не забочусь о пределе физической памяти. Я хочу знать, когда вся программа превышает 2Gb. Что ж, на справочной странице OS X для setrlimit есть RLIMIT_AS. Ближайший — RLIMIT_RSS. Действительно, IMHO OS X, похоже, выделяет много виртуальной памяти, учитывая то, что я вижу в мониторе активности. - person hectorpal; 19.07.2010
comment
Ммм... SUSv3 требует RLIMIT_AS (см. opengroup.org/onlinepubs/009695399/ functions/getrlimit.html), а OS X продается как SUSv3 UNIX, поэтому она должна поддерживать RLIMIT_AS. Действительно, <sys/resource.h> определяет RLIMIT_AS, хотя это не упоминается на странице руководства. Не могли бы вы попробовать RLIMIT_AS, чтобы убедиться, что это действительно реализовано? - person Yuji; 19.07.2010
comment
Кажется, я должен попробовать... Спасибо. - person hectorpal; 19.07.2010
comment
В Интернете есть различные сообщения о том, что setrlimit просто не работает в Darwin (OS X). lists.apple.com/archives/Unix-porting/2007/ апр/msg00026.html - person ephemient; 29.12.2010
comment
См. также матрицу функций в Раздел 7.11 APUE — - ясно сказано, что ограничение памяти не поддерживается в OS X (по крайней мере, не в 10.3, нужно проверить текущую версию). Ограничение виртуальной памяти поддерживается в OS X, хотя... - person krlmlr; 30.06.2014