Когда Linux начинает подкачку, вы в основном обречены. Очень скоро система больше не будет реагировать на какие-либо входные данные, но, к счастью, она будет работать до конца дней ...
Можете ли вы придумать команду, которая удерживает все процессы вообще, таким образом (и пока) позволяя вам открыть чистую оболочку, в которой вы можете исследовать источник проблемы и убить процесс, который занимал всю память? (Я думаю, это будет непросто, потому что, поскольку память, вероятно, полностью заполнена, вам нужно будет выгрузить еще немного памяти, чтобы освободить место для открытия оболочки, с другой стороны, все другие процессы обмена должны быть остановлены.)
Если вы связали такую команду с горячей клавишей, возможно, вы сможете использовать ее как аварийную кнопку, что сэкономит вам много времени. Есть идеи, возможно ли это вообще? Кто-нибудь пробовал что-то подобное раньше? Если бы можно было это реализовать, это была бы классная функция :)
Магия SysReq как упоминалось в других ответах, это действительно все, что у вас есть. Если у вас есть только доступ по SSH, вы можете запустить SysReq следующим образом:
# Enable Magic SysReq since most systems default this off
echo 1 > /proc/sys/kernel/sysrq
#call OOM Killer to try to free up memory
echo f > /proc/sysrq-trigger
Создание из этого исполняемого сценария и выполнение его, как только вы заметите, что подкачка может дать вам шанс. Отключение подкачки также возможно, если у вас достаточно памяти для обработки временных всплесков памяти или если вы не против убивать случайные программы, когда у вас заканчивается память.
В связи с этим, если у вас есть удаленная система с огромной нагрузкой, и вам нужно убить ее, вы можете использовать это для принудительной перезагрузки без полного завершения работы:
echo 1 > /proc/sys/kernel/sysrq
#Trigger BIOS reset
echo b > /proc/sysrq-trigger
Одно (неоптимальное!) Решение - предоставить Меньше замена.
Идея состоит в том, что примерно в тот момент, когда вы в отчаянии вскидываете руки, OOM убийца удары в.
Мой опыт использования Linux на машине с ограниченным объемом памяти предполагает, что
Для интерактивного использования
Некоторые особые случаи позволят вам расширить эти ограничения. Большие, но редко активные фоновые процессы будут «сидеть» в памяти, но лишь изредка становятся активными, поэтому они не вносят особого вклада в проблемы удобства использования.
В любом случае, план состоит в том, чтобы настроить доступный своп так, чтобы, как только машина становится настолько загруженной, вы не можете разумно убивать вещи вручную, когда вмешается убийца OOM.
Это не оптимально (несмотря на множество эвристик, доступных для OOM-убийцы), трудно быть уверенным, что он выберет «правильный».
Магия SysRq это самая близкая вещь к вашей кнопке, которую я знаю ...
Никогда не пробовал !, но возможно:
killall -SIGSTOP <main commands>
Видеть man killall
чтобы увидеть, как вы можете адаптировать его под свои нужды. В общем, вы можете запускать процесс с ulimit, чтобы держать их под контролем, и контролировать использование памяти с помощью чего-то вроде Nagios (альтернативные варианты см. В gazillion «Что за мониторинг ...»).
Вы также можете попробовать nice -20 bash
и у вас должна получиться отзывчивая оболочка ...