Из свопа - что происходит?


8

Что произойдет на моей машине с Debian VM с 512 МБ ОЗУ и подкачкой 348 МБ, если я открою файл 1 ГБ в редакторе и выйду из памяти?

Будет ли сбой системы? Или, если нет, как Linux справится с этим?

Разве не было бы разумно установить Swapspace, чтобы при необходимости автоматически и динамически создавалось достаточно подкачки?

sudo apt-get install swapspace

Почему бы вам не дать ему больше своп?
Гюнтберт


1
Обратите внимание, что некоторые редакторы просто запоминают файл и не загружают его сразу, это полностью решает проблему, поскольку они используют исходный файл как «swap».
Vality

Ответы:


17

Это зависит от настроек, с которыми вы работаете, в частности от чрезмерной загрузки памяти ( /proc/sys/vm/overcommit_memoryсм. man 5 procПодробности).

Если блокировка памяти отключена, попытка редактора (и, возможно, других программ, пытающихся одновременно) выделить память не удастся. Они получат результат отказа от системного вызова. Это зависит от каждой программы, хотя, к сожалению, общий результат - сбой программы. Редактор также может, например, просто отказать в открытии файла.

Если включена избыточная память, системный вызов, запрашивающий память, вполне может быть успешным. В этом случае, когда к памяти фактически обращаются, ядро ​​заметит, что ее недостаточно, и уничтожит процесс, чтобы восстановить память. Этот процесс может быть или не быть редактором. Выбор определяется oom_score(результатом нескольких эвристик ядра) и oom_score_adj(настраивается) каждого процесса в системе. Они также есть на этой странице proc (5).


5

В этом случае в Linux возникает огромная проблема, если вы подходите к состоянию нехватки памяти - вы заметите, что вся ваша система перестает отвечать на запросы, потому что она начинает много переставлять. Даже ваш курсор мыши может стать настолько «медленным», что вы не сможете запустить терминал и завершить процесс сброса памяти вручную. Это из-за огромного количества дисковых операций.

Чтобы избежать этой ситуации, я лично обычно полностью отключаю swap, поэтому ядро ​​Linux всегда отзывчиво, и в худшем случае убийца нехватки памяти (OOM) убьет какой-то процесс. Логика того, какой процесс уничтожен OOM, зависит от версии ядра.

Так что ответ - нет, не включайте динамическое распределение подкачки. Вы столкнетесь с зависаниями машины.

Это легко попробовать с помощью программы, которая просто постоянно выделяет некоторую память в цикле. Сохраните эту программу в текстовый файл memeater.c:

#include <stdlib.h>

int main() {
    for (;;) {char* mem=malloc(4096); mem[0]=1;};
}

Затем скомпилируйте это:

$ gcc memeater.c -o memeater

и запустить:

$ ./memeater

Попробуйте это со свопом, без свопа и с вашим динамическим распределением свопа.

Кроме того, имейте в виду, что в большинстве случаев это условие OOM возникает из-за ошибки в программном обеспечении (утечка памяти) или из-за того, что вы сделали что-то неправильно, например «загрузили этот файл размером 10 ГБ в редактор» или «запустили слишком много графических файлов, изменяющих размеры файла параллельно» и выполните вывод: вам нужен своп или нет?


1
+1 за то, что вы сами предложили простой метод тестирования
rubo77

1
Это отвечает на второй вопрос: «Это хорошая идея - использовать динамическое распределение подкачки».
gena2x

@ gena2x Да, это очень хорошая идея, потому что она делает вашу систему более отзывчивой в перегруженных ситуациях, вместо того, чтобы убивать ваши задачи один за другим. -1. Хотя лучше всего, если у вас большой фиксированный раздел подкачки, но у него есть другая причина (уменьшенная фрагментация подкачки).
Петер - Восстановить Монику

Если у вас установлен большой фиксированный обмен, ваша система перестает отвечать на запросы, потому что она будет пытаться выгружать активные задачи на диск, а они навсегда заменять их.
gena2x
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.