Как я могу предотвратить зависание Linux при нехватке памяти?

25

Сегодня я (случайно) запустил какую-то программу на своем компьютере с Linux, которая быстро использовала много памяти. Моя система зависла, перестала отвечать, и я не смог убить преступника.

Как я могу предотвратить это в будущем? Разве это не может, по крайней мере, поддерживать отзывчивое ядро ​​или что-то работающее?

johv
источник
Дубликат System зависает, когда ему не
хватает

Ответы:

15

Могу поспорить, что система на самом деле не «зависла» (в том смысле, что ядро ​​зависло), а скорее просто не отвечала. Скорее всего, он просто очень сильно менялся, что приводило к падению интерактивной производительности и пропускной способности системы.

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

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

Если вы знали, что собираетесь сделать что-то, что может вызвать массовое использование памяти, вы, вероятно, могли бы написать программу-обертку, которая выполняла бы mlockall()и затем выполняла вашу оболочку; это сохранило бы его в памяти, и было бы самым близким к тому, чтобы «сохранить отзывчивое ядро», которое вы, вероятно, получите (потому что проблема не в том, что процессор перегружен).

Лично я подписываюсь на метод управления ресурсами «не делай глупостей». Если у вас есть root, вы можете нанести системе всевозможные повреждения, и делать что-либо, о чём вы не знаете, вероятные результаты - рискованное дело.

romble
источник
2
К сожалению, «не делай глупостей» не помогает пользователям, которые запускают такие приложения, как Chrome (см. Выпуски 134612 , 393395 ).
Дан Даскалеску
1
@DanDascalescu И не всегда очевидно, что ты делаешь что-то глупое. Моя машина зависла на днях, потому что я изменил «UNION» в (сложном) запросе SQLite на «UNION ALL».
Майкл
Известные с ошибками программы могут (и должны) выполняться в конфигурации с ограниченными ресурсами - ulimitили даже cgroups в наши дни, если вы молодец, делает работу достаточно хорошо. Если вы вносите изменения в производственные запросы, не проверяя их влияние в некритической среде, это ваша первопричина.
Уомбл
8

Как упомянуто выше в комментарии Tronic, можно вызвать OOM-killer (из памяти киллера) напрямую с помощью комбинации клавиш SysRq- F.

SysRqКлавиша обычно сочетается внутри PrtScклавиши на клавиатуре.

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

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

Arkemlar
источник
0

Если вам захочется перекомпилировать ядро, вы можете попробовать патч из EDITраздела этого вопроса: /programming//q/52067753/10239615
Он не высвобождает Active(file)страницы при высоком давлении памяти и, таким образом, позволяет OOM-killer запуск почти мгновенно, потому что ядру больше не нужно тратить минуты постоянного чтения с диска повторяющихся кодовых страниц каждого процесса, вызывающих зависание ОС.


источник
-1

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

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

Антонис Христофидес
источник
4
Отключение свопинга в любой системе - плохая идея, потому что оно не позволяет выгружать неиспользуемые страницы и свободное место, используемое для дискового кэша. Это особенно верно, когда есть утечка памяти.
womble
2
А при выключенной системе система все еще может работать медленно из-за подкачки. Это будет просто безумно листать чистые страницы, а не грязные. (Поскольку без свопа он никогда не сможет удалить грязную страницу, ему всегда придется удалять чистые.)
Дэвид Шварц
У меня есть сервер с утечкой памяти. Когда это случилось в первый раз, мне пришлось нажать кнопку сброса, потому что сервер перестал отвечать на запросы. Но теперь, когда я выключил своп, сервер просто убивает дочерний элемент apache, если он становится слишком большим (это защита в дополнение к MaxRequestsPerChild). В результате сервер работает без проблем. В любом случае, на нем не так много неиспользуемых страниц, и, конечно же, это не безумно листает чистые страницы.
Антонис Христофидес
@AntonisChristofides: Я не уверен, что вы думаете об этом уроке на вынос. Ваше решение, безусловно, плохое, потому что оно снижает производительность из-за невозможности вытеснить редко используемые грязные страницы из физической памяти, оно не решает основную проблему, и вы рискуете, что убийца OOM может убить критический процесс. Вы случайно не столкнулись с конкретной опасностью, о которой я предупреждал, но вы все еще рискуете, потому что у вас нет свопа.
Дэвид Шварц
8
Со свопом или без него он все еще зависает до того, как автоматически запускается OOM killer. Это действительно ошибка ядра, которая должна быть исправлена ​​(т.е. запустите OOM killer раньше, перед тем как сбросить весь дисковый кеш). К сожалению, разработчики ядра и многие другие люди не видят проблемы. Распространенные предложения, такие как отключение / включение подкачки, покупка большего объема ОЗУ, выполнение меньшего количества процессов, установка ограничений и т. Д., Не решают основную проблему, заключающуюся в том, что низкое использование памяти ядром сосет верблюжьи шары. Тем временем я предлагаю запускать OOM killer вручную (SysRq-F), когда система зависает, так как это ускорит ее восстановление.
Tronic