Watchdog на Raspberry Pi 4

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, то у меня есть готовый план для настройки сторожевого таймера тут.