Назад | Перейти на главную страницу

Вопрос о разветвлении и распределении памяти

Я унаследовал сценарий Perl, который запускается на экземпляре EC2, который в основном сканирует кучу URL-адресов для данных (также известный как очистка). Этот сценарий вызывается через сценарий оболочки, который разветвляет несколько таких сценариев perl. В любой момент могут быть запущены сотни таких Perl-скриптов, в зависимости от процесса парсинга.

Каждый сценарий Perl делает следующее:

## create a temporary hash to hold everything ##
my %products = ();

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

У меня такой вопрос: что происходит, когда perl пытается добавить следующий продукт в массив «product», а памяти нет? Просто ждет или умирает? Моя интуиция говорит мне, что он умирает, но как я могу использовать выделение памяти в стиле malloc, если он не может выделить память, он ждет?

Лучше просто ограничить количество дочерних процессов?

Любые идеи очень приветствуются.

p.s. Это Perl v5.10.1 (*), созданный для i486-linux-gnu-thread-multi

Не уверен в специфике Perl, но на других динамических языках, таких как Python, вы получите сбой выделения памяти и последующий сбой вашей программы. Некоторые языки (включая Python) позволяют установить обработчик условия, Perl, вероятно, делает то же самое.

Я не уверен, откуда вы взяли, что malloc ждет, когда не может выделить память, реализация в Linux либо возвращает указатель, либо NULL, если запрос не выполняется.

Ситуация в Linux осложняется еще и тем, что Linux по умолчанию допускает превышение доступности памяти. Например, если в вашей системе доступно 4 ГБ виртуальной памяти, несколько процессов могут выделять почти 4 ГБ памяти. Память действительно используется до тех пор, пока они не загрязняют выделение. Если несколько процессов в конечном итоге это сделают, они исчерпают фактическую доступную память, и процесс-убийца Out Of Memory включится и завершит некоторые процессы.

Простым решением для вас было бы просто посмотреть, сколько памяти используют ваши процессы, и разрешить запускать только определенное количество одновременно. Более сложные решения включают использование структур данных фиксированной длины, чтобы использование памяти было известно, или потоковую передачу результатов на диск либо напрямую, либо через буфер, чтобы снизить использование памяти. Решение действительно зависит от приложения, и трудно предложить что-то более конкретное без подробного описания его функции.