Что произойдет на моей машине с Debian VM с 512 МБ ОЗУ и подкачкой 348 МБ, если я открою файл 1 ГБ в редакторе и выйду из памяти?
Будет ли сбой системы? Или, если нет, как Linux справится с этим?
Разве не было бы разумно установить Swapspace, чтобы при необходимости автоматически и динамически создавалось достаточно подкачки?
sudo apt-get install swapspace
memory
swap
out-of-memory
rubo77
источник
источник
Ответы:
Это зависит от настроек, с которыми вы работаете, в частности от чрезмерной загрузки памяти (
/proc/sys/vm/overcommit_memory
см.man 5 proc
Подробности).Если блокировка памяти отключена, попытка редактора (и, возможно, других программ, пытающихся одновременно) выделить память не удастся. Они получат результат отказа от системного вызова. Это зависит от каждой программы, хотя, к сожалению, общий результат - сбой программы. Редактор также может, например, просто отказать в открытии файла.
Если включена избыточная память, системный вызов, запрашивающий память, вполне может быть успешным. В этом случае, когда к памяти фактически обращаются, ядро заметит, что ее недостаточно, и уничтожит процесс, чтобы восстановить память. Этот процесс может быть или не быть редактором. Выбор определяется
oom_score
(результатом нескольких эвристик ядра) иoom_score_adj
(настраивается) каждого процесса в системе. Они также есть на этой странице proc (5).источник
В этом случае в Linux возникает огромная проблема, если вы подходите к состоянию нехватки памяти - вы заметите, что вся ваша система перестает отвечать на запросы, потому что она начинает много переставлять. Даже ваш курсор мыши может стать настолько «медленным», что вы не сможете запустить терминал и завершить процесс сброса памяти вручную. Это из-за огромного количества дисковых операций.
Чтобы избежать этой ситуации, я лично обычно полностью отключаю swap, поэтому ядро Linux всегда отзывчиво, и в худшем случае убийца нехватки памяти (OOM) убьет какой-то процесс. Логика того, какой процесс уничтожен OOM, зависит от версии ядра.
Так что ответ - нет, не включайте динамическое распределение подкачки. Вы столкнетесь с зависаниями машины.
Это легко попробовать с помощью программы, которая просто постоянно выделяет некоторую память в цикле. Сохраните эту программу в текстовый файл
memeater.c
:Затем скомпилируйте это:
и запустить:
Попробуйте это со свопом, без свопа и с вашим динамическим распределением свопа.
Кроме того, имейте в виду, что в большинстве случаев это условие OOM возникает из-за ошибки в программном обеспечении (утечка памяти) или из-за того, что вы сделали что-то неправильно, например «загрузили этот файл размером 10 ГБ в редактор» или «запустили слишком много графических файлов, изменяющих размеры файла параллельно» и выполните вывод: вам нужен своп или нет?
источник