Предотвращение «зависания» системы из-за полного использования физической памяти в Linux

На днях я узнал, что Linux действительно убивает процессы, если ему не хватает памяти. Я отключил своп с помощью команды swapoff до того, как это произошло. Обычно, если какой-либо процесс забирает всю память из-за ошибки, скажем, утечки памяти в цикле, моя система зависает (я знаю, технически это просто очень медленно), не убивая плохой процесс.

Как мне предотвратить это? Никакое программное обеспечение не является идеальным, и я запускаю плохо запрограммированные программы и время от времени сталкиваюсь с этой проблемой. Мне каждый раз приходится перезагружать свою систему. Это просто ограничение современных ядер? Я не могу просто отключить подкачку, потому что я знаю, что ядро ​​в какой-то мере использует подкачку для эффективного использования физической памяти, даже если физическая память достаточно велика.

Использование свопа меньшего размера может быть вариантом (меньшее время до OOM).

0
05.01.2017, 04:08
2 ответа

Убийца ядра Out Of Memory используется в крайнем случае. Если вы предоставите достаточно памяти и / или свопа для запущенных процессов, он не будет запущен.

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

Когда своп почти исчерпан, ядро ​​начинает завершать процессы, пытаясь сохранить работу остальных.Мне никогда не приходилось исследовать критерии, которые OOMK использует для выбора процессов, поэтому я не могу их вам здесь описать.

Решение - одно или несколько из следующих

  • Добавить больше физической памяти
  • Добавить больше (или немного) подкачки. Это может быть раздел диска или файл
  • Уменьшить количество или размер запущенных процессов
  • Исправить код в процессах с неуправляемой памятью

Некоторые другие ссылки

Можно установить для каждого процесса ограничение на объем памяти, который он может использовать. Когда он пытается превысить это значение, запрос на выделение не выполняется. Обычно это приводит к сбою программы либо неконтролируемым образом, потому что она не проверяла возвращаемое значение запроса на выделение, либо контролируемым образом с фатальным исключением.

2
28.01.2020, 02:34

Это старая проблема, которая мучает меня уже довольно давно. Судя по моему опыту работы с Linux, его убийца OOM НЕИСПРАВЕН. Это не работает. Браузер Chromium не убивает. Другие процессы он не убивает. Сегодня утром процесс Tumblerd чуть не сломал мою систему, использовав 2,1 ГБ. Даже после 3 минут ожидания на ужасно зависшей системе (он выжил благодаря моему сочетанию клавиш ниже )Linux НЕ убил процесс, используя 2,1 ГБ, что еще раз доказывает, что он не работает.

Я здесь не для того, чтобы спрашивать кого-либо, работает это или нет, так что приберегите свой ввод для другого человека. Обычное бла-бла-бла... (как грубо)

Единственный способ, которым я смог обойти эту проблему, заключается в том, что я постоянно наблюдаю за доступной памятью со свободными -часами, в противном случае я могу пропустить короткий порог времени, и вся система зависнет, что приведет к жесткому сброс настроек. Я установил сочетание клавиш в XFCE для сценария, который уничтожит все мои процессы Chromium, этого было достаточно для моего конкретного случая использования. Но было бы намного лучше, если бы я мог найти способ «убить процесс, использующий большую часть памяти» (, который я сейчас ищу из-за вышеупомянутого зависания сегодня утром )

.

Во-первых,проверьте, какой процесс вы хотите убить, используя эту команду:

ps aux | grep STRING
ps aux | grep PORTION_OF_NAME_WITHOUT_QUOTES_OR_SPACES

Если он показывает процесс, который вы хотите убить, поместите его в скрипт ниже в скобках.

#!/bin/bash
#
kill -9 $(ps aux | grep type=renderer)
# the above will kill all my Chromium processes
# without having to restart my entire browser or losing progress
# incognito window will be kept alive, instead of lost
#
sudo killall tumblerd
# (optional)

Вставьте это в пустой текстовый файл и сохраните как SOMETHING.SH. Затем сделайте его исполняемым, запустив chmod a+x /path/to/SOMETHING.SH. и назначьте его на сочетание клавиш (это возможно в XFCE)

Для процесса tumblerd лучший способ избежать проблем — удалить его из системы, так как он отвечает только за создание эскизов видео.

sudo apt remove tumbler

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

0
14.07.2020, 19:51

Теги

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