Я разрабатываю программу в го; иногда это приводит к выделению очень большого объема памяти (>> 10 ГБ на машине с 8 ГБ физической памяти), в результате чего система перестает отвечать на запросы. Я хочу ограничить объем памяти, который может выделить процесс. Обычный способ сделать это:
ulimit -m 4000000 ; ./myprogram
... которая должна убить мою программу, если она пытается использовать более 4 ГБ памяти.
На OS X El Capitan это, кажется, не имеет никакого эффекта; даже ulimit -m 1
(ограничение всех программ до 1 КБ памяти!) неэффективно.
Как я могу установить верхнюю границу памяти, доступной для определенного процесса?
macos
el-capitan
command-line
memory
development
cpcallen
источник
источник
ulimit -m
больше не работает в Linux (> 2.4.30), хотяulimit -v
все еще работает как ожидалось. (Какulimit -m
,ulimit -v
кажется , также не влияет на OS X.)Ответы:
Существует два подхода к ограничению использования памяти: ex post facto и превентивный. То есть вы можете попытаться убить вашу программу после того, как она станет слишком большой, или вы можете запрограммировать ее, чтобы она не стала слишком большой.
Если вы настаиваете на подходе ex post facto, вы можете использовать следующий скрипт Bash. Этот сценарий сначала находит объем памяти (определяемый «размером резидентного набора»), который использует процесс с processid pid, отфильтровывает все нечисловые данные с помощью grep и сохраняет количество как переменную n. Затем скрипт проверяет, больше ли n указанного вами x. Если это так, процесс с processid pid завершается.
Пожалуйста, обратите внимание:
<pid>
идентификатор процесса вашей программы.<x>
на rss = "размер резидентного набора" (т. Е. Реальный объем памяти), который вы не хотите, чтобы программа превышала.n=$(ps -<pid> -o rss | grep '[0-9]') if [ $n -gt <x> ]; then kill -9 <pid>; fi
Если вы хотите, чтобы это выполнялось каждые y секунд, просто включите его в цикл и попросите его ждать y секунд после каждой итерации. Вы также можете написать аналогичную команду, используя
top
. Ваша отправная точка будетtop -l 1|grep "<pid>"|awk '{print $10}'
.@ kenorb в ответ помог мне с моим сценарием
Хотя я полагаю, что это отвечает на вопрос, в долгосрочной перспективе я считаю, что лучше в программировании использовать упреждающий подход с использованием ручного распределения памяти.
Во-первых, вы уверены, что использование памяти действительно проблема? В Go документации говорится:
Если вы все еще думаете, что у вас есть проблема, тогда я рекомендую вам вручную управлять памятью, как это делается на языке программирования C. Поскольку go написан на C, я подозревал, что будут способы попасть в управление / распределение памяти C, и это действительно так. Посмотрите этот репозиторий GitHub, который,
Вариант использования задается как:
Это кажется лучшим долгосрочным решением.
Если вы хотите узнать больше о C (включая управление памятью), язык программирования C является стандартным справочником.
источник