Как я могу предотвратить зависание 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 запускаться почти мгновенно, потому что ядру больше не нужно тратить минуты постоянного чтения с диска всех исполняемых кодовых страниц каждого процесса, вызывающих зависание ОС.
Это особенно сложно предотвратить. Это потому, что ядро начинает меняться. Одним из решений является отключение свопа. Когда системе не хватает памяти, вместо того, чтобы начать подкачку, ядро убивает некоторые процессы; обычно он выбирает правильный процесс для уничтожения, но в любом случае лучше убить случайный процесс, чем иметь не отвечающую систему.
Это может быть особенно хорошим решением для серверов, поскольку серверы часто имеют достаточно оперативной памяти, и когда они начинают использовать пространство подкачки, это в любом случае означает, что что-то не так. Однако настольным компьютерам обычно требуется пространство подкачки, поэтому я думаю, что для настольных компьютеров нет хорошего решения. Я часто отключаю пространство подкачки на серверах, особенно когда есть подозрения на утечку памяти.