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

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

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

7 ответов

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

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

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

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

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

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

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

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

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

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

Эта ошибка известна с 2007 года - см. Зависание системы при большом использовании памяти.

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

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

Просто добавьте файл подкачки, если у вас его еще нет.

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

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

Другие вопросы по тегам