Память типа «root-set» перераспределение Ошибка - Erlang - PullRequest
1 голос
/ 26 августа 2011

Я запустил криптоинтенсивное приложение, которое генерировало псевдослучайные строки со специальной структурой и математическими требованиями.За последние 8 дней было создано около 1,7 миллиона номеров ваучеров на узел.Процесс генерации был загружен процессором, с очень низкими требованиями к памяти.Mnesia, работающая на OTP-14B02, была базой данных хранилища, и генерация выполнялась на каждой виртуальной машине.У меня было 3 узла в кластере со всеми таблицами мнезии disc_only_copies типа.Внезапно, когда активность на блоках Solaris увеличилась (другие пользователи вошли в систему удаленно и запускали веб-серверы, сеансы ftp и другие задачи), моя оболочка bash начала сообщать об ошибке
fork: not enough space.

Мои erlang Vms также вышли из строя с этой ошибкой ниже:

Crash dump was written to: erl_crash.dump
temp_alloc: Cannot reallocate 8388608 bytes of memory (of type "root_set").

Обычно мы получаем ошибки выделения памяти, а не memory re-location errors, и обычно память типа "heap" является проблемой,На этот раз сообщается тип памяти типа "root-set".

Qn 1. Что это за память "root-set"?

Qn 2. Имеет ли это отношение к нагрузке на процессор?(почему я спрашиваю, это то, что, когда я запускаю задачу, ответ машины говорит, что мышь или клавиатурные прерывания слишком медленные, это означает, что либо ЦП слишком занят, либо это какая-то другая проблема, которую я пока не могу объяснить)Можно ли избежать такой ошибки?и как ?

1 Ответ

1 голос
/ 26 августа 2011

Сообщение fork: not enough space предполагает, что это проблема с настройкой операционной системы, но:

Q1 - The Root Set

Root Set - это то, что сборщик мусора использует в качестве отправной точки при поиске данных, которые live в куче. Обычно он начинается с регистров виртуальной машины и выключается из стека, если в стеке есть ссылки на данные кучи, которые все еще должны быть активны. У Эрланга могут быть другие корни, о которых я не знаю, но это основные вещи, с которых вы начинаете.

То, что это ошибка перераспределения ровно 8 мегабайт, может означать одно из двух. Либо у вас нет 8 мегабайт свободного места в куче, либо куча фрагментирована до неузнаваемости, поэтому, несмотря на то, что в ней есть 8 мегабайт, такого непрерывного пространства нет.

Q2 - Влияние активности процессора

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

Вы должны быть более обеспокоены медленным временем отклика клавиатуры и мыши. Это может указывать на то, что что-то не так. Показывает ли vmstat 1, sysstat, htop, dstat или подобное что-то странное во время работы процесса? Вам также предстоит выяснить, не делает ли ядро ​​или C libc что-то странное из-за ограничения памяти.

Q3 - Как исправить

Я не знаю, как это исправить, не зная больше о том, что делает приложение. Поскольку у вас есть аварийный дамп, ваш первый инстинкт должен заключаться в том, чтобы взять средство просмотра аварийного дампа и посмотреть на этот дамп. Цель состоит в том, чтобы найти процесс, использующий много памяти, или процесс с глубоким стеком. С этого момента вы можете попытаться ограничить объем памяти, используемый процессом. либо переписав код, чтобы он мог раньше освободить память, либо настроив настройку сборки мусора для процесса (см. параметры spawn на страницах руководства erlang), либо добавив больше памяти в систему.

...