Можно ли вызвать OOM-killer при принудительной замене?

26

Можно ли заставить систему превентивно поменять местами неактивные страницы ( vm.swappiness), но вызвать oom-killer, когда в системе заканчивается ОЗУ (в отличие от нехватки памяти) и она вынуждена менять местами?

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

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

Не похоже, что это будет так сложно сделать. Кажется, что вы можете просто сказать, что oom-killer запускается, когда в системе используется X-ram / free. Но вот почему я спрашиваю; Я не знаю.

Для уточнения не хочу выключать своп или настраивать vm.swappinessпараметр

Патрик
источник
3
Интересно, что это происходит даже тогда, когда нет файла подкачки. Очевидно, что файлы, отображаемые в память только для чтения (например, исполняемые файлы, библиотеки, возможно, графические ресурсы), заменяются.
WGH
Oomd от Facebook - это демон пользовательского пространства, предназначенный для уничтожения процессов на основе общей пропускной способности системы (т. Е. Только при перегрузке). Но это кажется довольно сложным в настройке для настольных компьютеров / рабочих станций (которые, вероятно, не помещают задачи в cgroups или контейнеры).
Джеффри Босбом

Ответы:

22

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

Однако в пространстве пользователя мы можем делать все, что захотим. Поэтому я написал ранний демон OOM ( https://github.com/rfjakob/earlyoom ), который уничтожит самый большой процесс (по RSS), когда доступная оперативная память опустится ниже 10%.

Без раннего увеличения было легко заблокировать мою машину (8 ГБ ОЗУ), запустив http://www.unrealengine.com/html5/ несколько раз. Теперь вкладки виновных в браузере убиваются до того, как все выходит из-под контроля.

Jakob
источник
1
Спасибо, это именно то, что я искал. Теперь я могу продолжать работать column -t -s,с некоторыми огромными CSV-файлами и позволить earlyoomубить его, когда это невозможно, прежде чем замечать какую-либо неотзывчивость.
henfiber
4

Это звучит как слишком сложное решение. Я хотел бы предложить (и я делаю это на машинах, которые я настраиваю, которые не нуждаются в спящем режиме), просто выделяя небольшое количество пространства подкачки (128-256MiB). Таким образом, ядро ​​может поменять некоторые страницы, но OOM-killer вызывается до того, как дела пойдут плохо.

Если вы действительно хотите это сделать, я думаю, вам нужно написать свой собственный скрипт / программу, которая отслеживает использование подкачки и вызывает OOM-killer с помощью ключа Magic SysReq (что можно сделать программно, написав в /proc/sysrq-trigger).

mgorven
источник
1
Я бы сказал, что небольшой своп - не очень элегантное решение. В итоге вы ограничиваете полезность вашего свопа. Что, если у вас много неактивных страниц и вы получите выгоду от обмена 10 ГБ? У меня есть коробки с ~ 100 ГБ оперативной памяти, где 10 ГБ подкачки не является надуманной идеей. И написание приложения для этого в пользовательском пространстве просто открыто для проблем (по сравнению с изначально в ядре).
Патрик
Потому что тогда вам необходим механизм, позволяющий отличить «хороший обмен» от «плохой обмен», и этот алгоритм сложно разработать. Соответствующий объем подкачки, очевидно, зависит от объема ОЗУ и рабочей нагрузки, которую вы используете, поэтому, если 10 ГБ подходит для ваших машин, выделите это :-)
mgorven
Почему это будет сложно? Существует только 2 типа свопинга: упреждающий своп из-за vm.swappinessи принудительный своп из-за нехватки памяти. Все, что должно произойти, это когда ядро ​​вынуждено поменяться местами, чтобы запустить oom-killer. И 10 ГБ также оставляют тонны пространства для принудительного обмена, чтобы побить диск.
Патрик