Из Подкачки - Что происходит?

Я не уверен, имеет ли на OSX sshd реализация, но в некоторых системах, значение, когда у Вас нет tty, подразумеваемого корневого каталога с ~ / конвенция, может не расшириться, и можно получить некоторые неожиданные результаты. Я знаю, что это не решенный вопрос, но попробуйте именами полного пути вместо ~ / конструкция.

8
08.06.2014, 19:38
2 ответа

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

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

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

16
27.01.2020, 20:08

В Linux существует огромная проблема в том случае, если вы приближаетесь к состоянию вне памяти - вы заметите, что вся ваша система становится абсолютно невосприимчивой, потому что начинается много переключений. Даже курсор мыши может стать настолько "медленным", что Вы не сможете запустить терминал и убить обижающего пожирателя памяти вручную. Это происходит из-за огромного количества дисковых операций. Чтобы избежать этой ситуации, я обычно полностью отключаю подкачку, так что ядро 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Гб файл в редактор" или "запустите параллельно слишком много графических файлов", и сделайте вывод, нужно ли вам подкачивать или нет.

6
27.01.2020, 20:08

Теги

Похожие вопросы