Можно ли заставить убийцу ООМ вмешаться раньше?


34

Я пытаюсь настроить свою систему разработки на максимальную надежность. Я отключил подкачку, потому что для использования графического интерфейса это в основном делает машину безразличной таким образом, что больше не может использоваться. Тем не менее, если агрессивные приложения съедают память, некоторые механизмы, похоже, используют это, чтобы максимально эффективно использовать затраты на скорость. Операции подкачки жесткого диска не существует, но система также перестает отвечать на запросы. Поэтому я хочу позволить убийце OOM включиться до того, как система предпримет какие-либо особые усилия по увеличению памяти. Можно ли настроить убийцу OOM для работы, если, например, свободной физической памяти менее 100 МБ?


2
Я думаю, что реальная проблема здесь в том, что не хватает оперативной памяти для начала. Вы не будете использовать своп, если нет оперативной памяти. Отключив своп ... у вас кончается баран, и у вас нет места, где его публиковать Что приводит к неприятным вещам. Кажется, ваша система настроена плохо, и никакие изменения не помогут.
Подмастерье Компьютерщик

8
Я не согласна Разработка и использование энергии часто включает экспериментальное использование. Например, при использовании инструмента обработки изображений из командной строки не указывается, сколько памяти занимает его работа по отношению к размеру изображения. Так что я просто бегу. И я не ожидаю, что это сделает всю мою машину бесполезной. В одном эксперименте я мог бы использовать ulimit для обеспечения его безопасности, но для всей системы, где иногда требуется много операций, ограничение одного процесса не так полезно, но, безусловно, «страхование жизни» для всей машины.
Дронус

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

7
@JourneymanGeek, вы в левом поле. Диски медленны по сравнению с оперативной памятью, поэтому резкая замена всегда приводит к остановке системы. Конечно, ему не хватает памяти, потому что он попытался запустить программу, которая использует много памяти. Вопрос в том, что делать, когда не хватает памяти? Убейте свинью или замедлите из-за того, что на диске не осталось памяти.
psusi

2
@ TomWijsman, дисковый ввод-вывод на много порядков медленнее, чем ввод-вывод в память, поэтому использование подкачки диска всегда означало огромное замедление. Иногда (особенно в старые времена, когда баран был дорогим, и у большинства людей было мало), предпочтительнее не иметь возможности делать то, что вы пытались вообще. В наши дни диск НАСТОЛЬКО медленнее, чем оперативная память, и оперативная память достаточно дешевая, чтобы у большинства людей их было достаточно, поэтому в редких случаях, когда они случайно запускают что-то, использующее больше оперативной памяти, чем у них, часто лучше сдаться, чем взять 1000 раз, чтобы сделать это.
psusi

Ответы:


36

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

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

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


3
Спасибо, что почесали этот зуд! Любить раннее пока.
Томас Феррис Николаизен

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

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

12

Политика ядра по умолчанию - разрешать приложениям выделять виртуальную память, пока есть свободная физическая память. Физическая память фактически не используется до тех пор, пока приложения не коснутся виртуальной памяти, которую они выделили, поэтому приложение может выделить гораздо больше памяти, чем имеет система, а затем начать касаться ее позже, в результате чего ядру не хватит памяти, и вызвать выход памяти (ООМ) убийца. Однако до того, как процесс прерывания будет завершен, он вызвал очистку дискового кэша, что заставляет систему медленно реагировать на некоторое время, пока кэш не будет заполнен.

Вы можете изменить политику по умолчанию, чтобы запретить переполнение памяти, записав значение от 2 до /proc/sys/vm/overcommit_memory. Значение по умолчанию /proc/sys/vm/overcommit_ratio- 50, поэтому ядро ​​не позволит приложениям выделять более 50% оперативной памяти + своп. Если у вас нет свопа, то ядро ​​не позволит приложениям выделять более 50% оперативной памяти, оставляя остальные 50% свободными для кеша. Это может быть немного чрезмерно, поэтому вы можете увеличить это значение, скажем, до 85%, чтобы приложения могли выделять до 85% оперативной памяти, оставляя 15% для кэша.


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

3
@ TomWijsman, вопрос проясняет, что он не постоянно находится в условиях нехватки памяти; он просто иногда запускает команду, которая занимает неожиданно большой объем памяти. Покупка дополнительной памяти - не единственное решение, когда у вас заканчивается. Другие потенциальные решения включают в себя поиск лучших способов использовать память, которую вы имеете, или просто не делать то, что требует столько памяти. Вопрос проясняет, что последнее более приемлемо, чем выходить и покупать больше барана.
psusi

Какая строка в вопросе проясняет это? Я вижу противоположное в I disabled swap, because for GUI usage it mostly renders the machine unresponsive in such a way not useable anymore.. Он упомянул GUI, а вы предполагаете, что он запускает команду. Покупка большего объема памяти - это первое решение, использование меньшего объема памяти - это второе решение, а обеспечение нестабильной работы системы за счет использования стабильных значений по умолчанию - последнее решение. На этот вопрос не нужно отвечать буквально, поэтому я не понимаю, в чем ваша проблема, что вы должны беспокоить нас обоих в комментариях. Рэнт не помогает ...
Тамара Вийсман

4
Эй, этот ответ звучал довольно круто. К сожалению, «commit» относится к требованию к виртуальной памяти, что, по мнению программистов приложений, весьма плохо. Например , с моим (без замены) рабочего стола работает, есть около 400 из 2000 Мб физической памяти используется, но 1600mb «commit'ted , как /proc/meminfo» s Committed_ASгосударств. В некоторых запущенных приложениях это значение превышает физическую память, поэтому трудно установить допустимый предел.
Дронус

3
Сохраните свою работу, прежде чем пытаться это! У PI были сбои во всем (bash, менеджер окон и т. Д.).
jozxyqk

8

Для меня установка vm.admin_reserve_kbytes = 262144 делает именно это. Убийца OOM вмешивается до того, как система перестает отвечать на запросы.


1
Мне нравится идея, но значит ли это, что у вас никогда не было 256 МБ физической памяти?
Жером Пуйлер

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

4

Другие ответы имеют хорошие автоматические решения, но я считаю, что может быть полезно также включить SysRqключ, когда все выходит из-под контроля. С помощью SysRqключа вы будете вручную отправлять сообщения ядру, и вы сможете делать такие вещи, как безопасная перезагрузка (с SysRQ + REISUB), даже если пользовательское пространство полностью заморожено.

Чтобы разрешить ядру прослушивать запросы, установить kernel.sysrq = 1или включить только те функции, которые вы, вероятно, будете использовать с битовой маской (документировано здесь ). Например kernel.sysrq = 244, включит все комбинации, необходимые для безопасной перезагрузки выше, а также ручной вызов убийцы OOM с помощью SysRq + F.


-2

Надежность не достигается из-за нехватки памяти и убийцы OOM.

Неправильно организовывать вечеринку в шкафу и помещать «вычищать мой шкаф» в свой маленький плейлист.

Можно ли заставить убийцу ООМ вмешаться раньше?

Это может привести к непреднамеренным побочным эффектам, потому что вы не можете контролировать то, что убито.

Я пытаюсь настроить свою систему разработки на максимальную надежность.

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

Простая настройка случайных вещей никуда не приведет ...

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

Из-за нехватки памяти отключение подкачки не улучшит поведение , а наоборот .

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

Операции подкачки жесткого диска не существует, но система также перестает отвечать на запросы.

Недостаток памяти действительно приводит к отсутствию ответа независимо от того, есть ли у вас своп или нет.

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

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

Можно ли настроить убийцу OOM для работы, если, например, свободной физической памяти менее 100 МБ?

Возможно, но вы получите более высокую отдачу от инвестиций, если просто купите дополнительную память, которая на самом деле не стоит больших денег в наши дни. Учтите, что в долгосрочной перспективе вы можете ударить себя по ноге, если продолжите работать в условиях нехватки памяти. OOM похож на судебного пристава, он не помогает вам, он помогает ОС ...


7
Конечно, отключение подкачки улучшает поведение, потому что вместо того, чтобы перегрузить диск, OOM запускает и убивает захват памяти. Бегство вне барана не является проблемой (а добавление большего означает лишь то, что вам нужно стараться изо всех сил, чтобы закончиться). Проблема в том, что делать, когда у вас закончились. Вы хотите, чтобы OOM убил свинью и, таким образом, ослабил состояние нехватки памяти.
psusi

7
Потому что уничтожение приложения, которое пытается использовать больше памяти, чем у вас, предпочтительнее, чем поставить всю систему на колени. В идеальном мире у вас будет неограниченная память, и вы никогда не закончите, но на самом деле, иногда вы выбываете случайно, и вам скорее скажут «недостаточно памяти», чем остановят систему.
psusi

5
Покупка дополнительной памяти может решить некоторые проблемы, в зависимости от суммы покупки. Но это не меняет того факта, что могут быть непредвиденные использования на порядки. Поэтому я хочу, чтобы приложение не работало, но НЕ система в этих условиях. Некоторые примеры: Обработка папки, полной сжатых изображений, большинство из которых имеют «нормальный» размер, но некоторые из них действительно большие. Небольшая ошибка может привести к мертвой петле с разгоном памяти, съедая 1 ГБ / с. Случайно откройте видеофайл в текстовом редакторе. Обычно это заканчивается такими симптомами, как отрывистая мышь и почти мертвый пользовательский интерфейс, пока не
сработает

6
@TomWijsman есть также почти мертвые циклы, поскольку есть алгоритмы, которые ведут себя линейно в среднем случае, но экспоненциально в худшем случае, в зависимости от входных данных. И я не могу отправить сигнал уничтожения, если мышь дергается и щелчки, а также ввод с клавиатуры показывают задержку в одну минуту. Я обычно переключаюсь на терминал в текстовом режиме и жду минут, чтобы войти в систему, чтобы просто выдать killслепо напечатанный текст .
Дронус

7
У меня нет проблем с уничтожением приложений, которые также могут быть запущены. Рассмотрим систему с физическим подкачкой 2 ГБ + 2 ГБ. Приложение, которое быстро исчерпывает физическую память, может легко съесть обмен. Это просто умрет позже, после того как система перестанет отвечать на запросы от нескольких минут до нескольких часов. Так почему бы не убить его быстро, пока работа графического интерфейса не стала нестабильной? Многие процессы выполняют всю работу с 10 МБ, некоторые занимают 1 ГБ, а некоторым редким потребуется 10 ГБ, это жизнь.
Дронус
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.