Предотвращение зависания Ubuntu, даже если системной памяти мало

24

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

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

Вот что делает для меня Ubuntu: съесть всю свободную память, затем попросить операционную систему поменять местами все необходимые службы (сеанс gnome, терминал, клавиатуру), затем заморозить и подождать, пока я отключу шнур питания.

Два вопроса:

  1. Как операционная система может предположить, что что-то может быть настолько важным, что можно перестать слушать вводимые пользователем данные?
  2. Как я могу сказать Ubuntu никогда не менять местами основные службы и всегда реагировать на ввод пользователя, даже если какой-то глупый процесс пытается съесть больше ресурсов, чем предоставляет система.
Klamann
источник
Сколько оперативной памяти у вас установлено? Какого размера ваш своп (в терминале наберите, swaponчтобы узнать)? Cheers, Al
heynnema
3
16 ГБ оперативной памяти и 16 ГБ подкачки. Но не в этом суть, эту проблему нельзя решить, добавив больше памяти.
Кламанн
1
Попробуйте одну из двух вещей. 1) измените swappinessнастройку на 10, то есть: vm.swappiness = 10в /etc/sysctl.conf. Поиск здесь для подкачки для получения дополнительной информации об этом. 2) Если замена не помогает ... Даже если вы не хотите ... увеличить размер файла подкачки до 1.5x16G и посмотрите, поможет ли это. Держи меня в курсе. Cheers, Al
heynnema
1
@ Кламанн, я согласен, добавление свопа не решит проблему. Если у вас сломанная программа, потребляющая все RAM + SWAP, добавление дополнительного SWAP только задерживает неизбежное.
WinEunuuchs2Unix
1
@ WinEunuuchs2Unix, как я уже сказал, vm.swappiness=10нужно добавить в sysctl.conf. Опытный человек может даже использовать команду sysctl на лету, чтобы установить vm.swappiness = 10, не редактируя файл sysctl.conf. Приветствую, Ал пс: жду ответа ОП.
Хейнема

Ответы:

5

У меня до сих пор нет решения этой проблемы, но я могу предложить два обходных пути, которые могут быть интересны другим:

1) раннее

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

Я протестировал его с помощью демонстрационного процесса, который неопределенно запрашивает память небольшими порциями. Вот мое первое впечатление: когда я запускаю мошеннический процесс, он быстро израсходует всю мою оперативную память. Затем начинается обмен, система перестает отвечать на запросы. Через несколько секунд система снова подключается. Журнал Earlyoom показывает, что он уничтожил процесс потребления памяти после того, как использование памяти и подкачки достигло 90%.

Раздражающее запаздывание все еще существует, когда начинается подкачка и после того, как процесс был остановлен, некоторые части других процессов обычно остаются в подкачке, пока их не запросят, но это начало.

2) просто отключить своп

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

Вы можете отключить обмен для текущего сеанса sudo swapoff -aили сделать изменение постоянным .


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

Klamann
источник
1
Я отключил подкачку, и моя система перешла прямо из памяти (<100 МБ) в зависание. Как я могу узнать, активирован ли OOM killer?
Майкл
0

Попробуйте одну из двух вещей:

1) измените настройку swappiness со значения по умолчанию, равного 60, на 10, то есть: добавьте vm.swappiness = 10 в /etc/sysctl.conf (в терминале, введите sudo gedit /etc/sysctl.conf), затем перезагрузите систему. Поиск здесь для подкачки для получения дополнительной информации об этом.

2) Если подкачка не помогает ... даже если вы не хотите ... увеличить размер файла подкачки до 1.5x16G и посмотрите, поможет ли это.

Держи меня в курсе. Ура, Ал

heynnema
источник
Я настроил виртуальную машину для запуска некоторых тестов, потому что перезагрузка моей ОС каждые несколько секунд действительно раздражала. Ubuntu 16.04, оперативная память 2 ГБ, подкачка 3 ГБ, диск 20 ГБ. Затем я запустил скрипт, который потребляет много памяти: по умолчанию swappiness (60) система зависает и через несколько минут я выключаю его, потому что время восстановления было неприемлемым. С swappiness 10 система зависает на несколько секунд, затем она принимает ввод, но вы не можете запускать какие-либо процессы (например, topчтобы убить захват памяти). Примерно через минуту процесс убивается. Не идеально, но мы все ближе.
Кламанн
Держать нас в курсе. Виртуальная машина не будет эмулировать вашу реально работающую ОС, но позволит вам поиграть с настройками. Мне было бы любопытно, если перестановка поможет с вашей проблемой. Cheers, Al
heynnema
А, хорошо. Прогресс! Читайте немного о перестановке. Вы можете немного поиграть со значением. Cheers, Al
heynnema
Сколько подкачки использовалось, когда система зависала? Cheers, Al
heynnema
2
почему, какой в ​​этом смысл? больше памяти не предотвратит застревание системы, если я тоже высосу эту память.
Кламанн
0

Я решил похожую проблему. Я не знаю, подходит ли вам мой опыт ...

Недавно я опубликовал руководство по установке linux на петлевые устройства LVM, загружающиеся с USB (поэтому без необходимости устанавливать grub на внутренний диск, оставляя его оригинальным). Вот руководство: https://github.com/DareDevil73/linux-on-loopback-usb .

Затем я столкнулся с проблемой замораживания при высокой загрузке памяти и наблюдал ненормальное использование пространства подкачки (все израсходованное ОЗУ и использование подкачки близко к нулю). Очевидно, что раздел подкачки LVM был смонтирован и работает должным образом, но я не знаю, почему ядро ​​не использовало его должным образом.

Я попробовал альтернативное решение. Я создал файл обратной петли подкачки (не LVM) и заморозка исчезла. Теперь файл подкачки используется так, как он есть, и ОС никогда не зависает!

Пожалуйста, посмотрите https://github.com/DareDevil73/linux-on-loopback-usb#known-issues, чтобы получить более подробную информацию.

Антонио Петричка
источник
Пожалуйста, расширьте ссылки в ответах.
Конрад Гаевский