Перезагрузить систему, если закончилась память?

Перезагрузить систему, если закончилась память?

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

Есть ли способ настроить его так, чтобы система перезагружалась, а не зависала, если используется слишком много памяти? (У меня есть root-доступ). Версия ядра — 4.9.0.

решение1

Для мониторинга/восстановления управления «нестабильным»/неисправным сервером я бы посоветовал использовать аппаратное обеспечение или, в случае его отсутствия, программное обеспечение для наблюдения; в Debian вы можете установить его с помощью:

sudo apt-get install watchdog

Затем вы редактируете /etc/watchdog.confи добавляете пороговые значения или тесты; на мой взгляд, сторожевой таймер также активируется таким образом, что если ядро ​​не видит его в течение длительного времени, оно перезагружается. Например, если программная процедура не взаимодействует с фиксированным временем /dev/watchdog0или что-то в этом роде.

Например, вы можете определить пороговые значения нагрузки в /etc/watchdog.conf:

max-load-1             = 40
max-load-5             = 18
max-load-15            = 12

Также имейте в виду, что некоторые платы/чипсеты поставляются со встроенными сторожевыми таймерами; если я не ошибаюсь, Arm A20 — один из них.

Отчеловек сторожевой пес

Ядро Linux может сбросить систему, если обнаружены серьезные проблемы. Это может быть реализовано с помощью специального оборудования watchdog или с помощью немного менее надежного программного watchdog внутри ядра. В любом случае, должен быть демон, который сообщает ядру, что система работает нормально. Если демон перестает это делать, система сбрасывается.

watchdog — это такой демон. Он открывает /dev/watchdog и продолжает писать в него достаточно часто, чтобы не допустить сброса ядра, по крайней мере раз в минуту. Каждая запись откладывает время перезагрузки еще на минуту. После минуты бездействия аппаратное обеспечение watchdog вызовет сброс. В случае программного watchdog возможность перезагрузки будет зависеть от состояния машин и прерываний.

Демон сторожевого таймера можно остановить, не вызывая перезагрузки, если устройство /dev/watchdog закрыто правильно, если только ваше ядро ​​не скомпилировано с включенной опцией CONFIG_WATCHDOG_NOWAYOUT.

смотрите такжеRaspberry Pi и Arduino: создание надежных систем с помощью сторожевых таймеров

решение2

Чтобы ответить на ваш конкретный вопрос, вы можете установить sysctls следующим образом:

vm.panic_on_oom=1
kernel.panic=10

таким образом, ядро ​​впадет в панику, если в системе закончится память, а затем перезагрузится через десять секунд паники.

В новых системах с полной поддержкой cgroups2 systemd-oomd может оказаться менее радикальным вариантом.

Связанный контент