Сегодня я (случайно) запустил какую-то программу на своем компьютере с Linux, которая быстро использовала много памяти. Моя система зависла, перестала отвечать, и я не смог убить преступника.
Как я могу предотвратить это в будущем? Разве это не может, по крайней мере, поддерживать отзывчивое ядро или что-то работающее?
Ответы:
Могу поспорить, что система на самом деле не «зависла» (в том смысле, что ядро зависло), а скорее просто не отвечала. Скорее всего, он просто очень сильно менялся, что приводило к падению интерактивной производительности и пропускной способности системы.
Вы можете отключить подкачку, но это только изменит проблему с низкой производительности на процессы, убитые OOM (и все интересное, что вызывает), наряду со снижением производительности из-за уменьшения доступного дискового кэша.
С другой стороны, вы можете использовать ограничения ресурсов для каждого процесса (обычно называемые
rlimit
и / илиulimit
), чтобы исключить возможность того, что один процесс займет смешной объем памяти и вызовет перестановку, но это просто толкает вас на интересную территорию с процессами, которые умирают при неудобные моменты, потому что они хотели немного больше памяти, чем система хотела дать им.Если вы знали, что собираетесь сделать что-то, что может вызвать массовое использование памяти, вы, вероятно, могли бы написать программу-обертку, которая выполняла бы
mlockall()
и затем выполняла вашу оболочку; это сохранило бы его в памяти, и было бы самым близким к тому, чтобы «сохранить отзывчивое ядро», которое вы, вероятно, получите (потому что проблема не в том, что процессор перегружен).Лично я подписываюсь на метод управления ресурсами «не делай глупостей». Если у вас есть root, вы можете нанести системе всевозможные повреждения, и делать что-либо, о чём вы не знаете, вероятные результаты - рискованное дело.
источник
ulimit
или даже cgroups в наши дни, если вы молодец, делает работу достаточно хорошо. Если вы вносите изменения в производственные запросы, не проверяя их влияние в некритической среде, это ваша первопричина.Как упомянуто выше в комментарии Tronic, можно вызвать OOM-killer (из памяти киллера) напрямую с помощью комбинации клавиш SysRq- F.
SysRqКлавиша обычно сочетается внутри PrtScклавиши на клавиатуре.
OOM-killer убивает некоторые процессы, и система снова становится отзывчивой. Прямой доступ к OOM-killer не может быть включен по умолчанию, пожалуйста, проверьте этот вопрос, чтобы узнать, как проверить его состояние и / или включить его.
PS: это мне очень помогло. Я согласен с мнением, что это самый полезный совет по поводу этой проблемы, если она вызвана Chrome или каким-либо другим программным обеспечением, жадным до памяти. Но нужно помнить, что OOM-killer может убить какой-то действительно важный процесс, используйте его осторожно.
источник
Эта ошибка известна с 2007 года - см. Зависание системы при большом использовании памяти .
В этой ситуации Windows отображает диалоговое окно, предупреждающее пользователя о закрытии одного или нескольких приложений.
источник
Если вам захочется перекомпилировать ядро, вы можете попробовать патч из
EDIT
раздела этого вопроса: /programming//q/52067753/10239615Он не высвобождает
Active(file)
страницы при высоком давлении памяти и, таким образом, позволяет OOM-killer запуск почти мгновенно, потому что ядру больше не нужно тратить минуты постоянного чтения с диска повторяющихся кодовых страниц каждого процесса, вызывающих зависание ОС.источник
Это особенно сложно предотвратить. Это потому, что ядро начинает меняться. Одним из решений является отключение свопа. Когда системе не хватает памяти, вместо того, чтобы начать подкачку, ядро убивает некоторые процессы; обычно он выбирает правильный процесс для уничтожения, но в любом случае лучше убить случайный процесс, чем иметь не отвечающую систему.
Это может быть особенно хорошим решением для серверов, поскольку серверы часто имеют достаточно оперативной памяти, и когда они начинают использовать пространство подкачки, это в любом случае означает, что что-то не так. Однако настольным компьютерам обычно требуется пространство подкачки, поэтому я думаю, что для настольных компьютеров нет хорошего решения. Я часто отключаю пространство подкачки на серверах, особенно когда есть подозрения на утечку памяти.
источник