Watchdog на Raspberry Pi 4

Заметил, что в моём кластере малин регулярно зависает одна нода. Неужели вы думаете, что я пошёл читать логи и разбираться в проблеме? Нет, конечно, ведь можно просто воспользоваться сторожевым таймером, который встроен в BCM2711!
Сторожевой таймер, реже контрольный таймер (англ.watchdog timerбукв. «сторожевой пёс») — аппаратно реализованная схема контроля над зависанием системы. Представляет собой таймер, который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение некоторого интервала времени, происходит принудительная перезагрузка системы.
(wiki)
Я использую Ubuntu 20.04 и там уже заранее включен в ядре нужный модуль, проверить это можно так наличием /dev/watchdog
и отсутствием подгруженного модуля softdog
(его наличие будет указывать на то, что используется не аппаратный таймер):
root@node03:~# file /dev/watchdog
/dev/watchdog: character special (10/130)
root@node03:~# lsmod|grep softdog
root@node03:~#
Далее нам понадобится установить ПО для работы со сторожевым таймером:
apt install watchdog
И настроить его изменением файла /etc/watchdog
. Он уже содержит набор примеров, можно проглядеть их. К слову, у меня ping не заработал и я получил ноду, которая ушла в циклический ребут. В целом, не рекомендуется перезагружать машину всего лишь по отсутствию пинга, но если уж очень захочется, имейте ввиду, что в Ubuntu 20.04.2 с этим были проблемы. Мой конфиг:
# Как часто (в секундах) обнулять таймер
interval = 1
# Перезагружать машину, если LA больше 24 в течении минуты
max-load-1 = 24
# Адрес устройства сторожевого таймера
watchdog-device = /dev/watchdog
# Устанавливет аппаратный таймер на 10с. Если не будет сброшен за это время
# машина перезагрузится
watchdog-timeout = 10
# Всегда даржать утилиту в памяти и установить высокий приоритет
realtime = yes
priority = 1
# Перезагрузка по превышению 85 градусов. Она заявлена как максимальная
# температура для BCM2711, однако некоторые компоненты RPi4 работают
# лишь до 75, решайте сами надо ли оно вам
# Некоторые источники утверждают, что в сервисе есть либо sensor,
# либо device, можно оставить оба, от лишнего ключа ничего не сломается
temperature-sensor = /sys/class/thermal/thermal_zone0/temp
temperature-device = /sys/class/thermal/thermal_zone0/temp
max-temperature = 85
После этого остаётся лишь включить этот сервис командой systemctl enable --now watchdog
и всё заработает.
Если вы используете system-upgrade-controller в вашем кластере k8s, то у меня есть готовый план для настройки сторожевого таймера тут.