Существует два подхода к ограничению использования памяти: 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 документации говорится:
Распределитель памяти Go резервирует большую область виртуальной памяти в качестве арены для распределений. Эта виртуальная память является локальной для определенного процесса Go; резервирование не лишает другие процессы памяти.
Если вы все еще думаете, что у вас есть проблема, тогда я рекомендую вам вручную управлять памятью, как это делается на языке программирования C. Поскольку go написан на C, я подозревал, что будут способы попасть в управление / распределение памяти C, и это действительно так. Посмотрите этот репозиторий GitHub, который,
позволяет вам осуществлять ручное управление памятью через стандартный C-распределитель для вашей системы. Это тонкая оболочка поверх malloc, calloc и не содержит. Смотрите man malloc для получения подробной информации об этих функциях для вашей системы. Эта библиотека использует cgo.
Вариант использования задается как:
Зачем тебе это?
Когда программа вызывает нехватку памяти или системе не хватает памяти, может быть полезно вручную управлять выделением и освобождением памяти. Go может помочь вам контролировать распределение, но невозможно явно освободить ненужные данные.
Это кажется лучшим долгосрочным решением.
Если вы хотите узнать больше о C (включая управление памятью),
язык программирования C является стандартным справочником.