LINUX.ORG.RU

Можно ли восстановить сервер при watchdog: BUG: soft lockup - CPU#N stuck?

 ,


0

1

Привет, ЛОР.

Каюсь, в администрировании Linux систем не силён, постараюсь описать ситуацию максимально подробно.

Дано: Домашний сервер, в роли которого выступает мини-пк, на нём запущено множество Docker контейнеров с нужными мне сервисами (Immich, Jellyfin, Cgit, etc).

Всё это работает 24/7@365, недавно, спустя около 60 дней аптайма обнаружил систему в полностью зависшем состоянии.

Исследование логов после жесткой перезагрузки показало следующее (https://0x0.st/Po1L.jpg).

Покурив мат. часть я понимаю что произошло, первопричина вне моего контроля, но вопрос вот в чем: Есть ли способы автоматического восстановления сервера при возникновении таких ситуаций?

Поскольку сейчас есть 2 проблемы:

  1. Приходится делать hard reset
  2. Я не всегда физически рядом с этим сервером, чтобы нажать кнопку.

Буду признателен за любую полезную информацию по теме.

★★★★★

Ты хочешь сказать сервер завис как раз в тот момент который в логе указан? Но на диск лог почему-то записать смог?

Там некий vsulimov за минуту до ошибки залогинился, возможно он её и устроил.

Сделать hard reset програмно не проблема, но сначала надо разобраться что же случилось. А ты либо не до конца разобрался, либо сюда не всё написал.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

vsulimov - это я.

Сервер по ssh доступен только внутри локальной сети и никто кроме меня доступа к нему не имеет.

После логина по ssh был запущен скрипт, который по rsync синхронизирует локальное зеркало Arch Linux. Сам скрипт достаточно стандартный и по крону отрабатывает каждый день без проблем (https://git.vsulimov.com/arch-mirror-sync.git/tree/sync-mirror.sh)

Меня смущает, что в процессах замешан containerd-shim, буд-то бы это часть docker, но ничего связанного с ним в этот момент я не делал.

Jefail ★★★★★
() автор топика
Ответ на: комментарий от Jefail

Так полное зависание то случилось именно в ту секунду что в логе указана про ядро проца или нет? И это конец лога лии дальше ещё строчки есть до ребута?

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Да, потому что изменений с зеркалом не было и скрипт завершился достаточно быстро, а после этого система повисла, но ничего более я со своей стороны не делал.

Это последние строчки лога, ничего более нет.

Jefail ★★★★★
() автор топика
Последнее исправление: Jefail (всего исправлений: 1)
Ответ на: комментарий от Jefail

Ну, строки означают что ядро ушло в бесконечный (или по крайней мере чрезмерно длинный) цикл при обработке какого-то сисколла или прерывания, и не хочет отдавать управление. containerd-shim тут - тот процесс, который в это время выполнялся, он может и не быть виноватым в случившемся. А может и быть. Потом, видимо, так же зациклились и остальные процовые ядра, и работать всё перестало.

Если ты рассчитываешь, что при следующем повторении ситуации этот лог тоже успеет сгенерироваться перед зависанием, то можно при его обнаружении сразу делать hard reset - для этого надо вывести что-то в порт 0x64, сейчас поищу точный код.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Мда, думал на своих компах найти эту прогу но видимо так давно ей не пользовался что она где-то потерялась.

В инете нашёл

#include <sys/io.h>

int main(void) {
  iopl(3);
  outb(0xfe, 0x64);
  return 0;
}
вот эта штука, будучи запущеной от рута, делает hard reset компу. Эта штука со времён первых PC/AT (80286 проц), но для совместимости её поддерживают. По крайней мере до недавних пор оно работало везде.

firkax ★★★★★
()

Я не всегда физически рядом с этим сервером, чтобы нажать кнопку.

Любая железка может зависнуть. Нейтрино где не надо пролетело и привет. Купи себе GL-RM1 + Fingerbot и просто забудь про то, что ты не можешь всегда быть рядом. Такой себе колхоз-вариант на тему iLO/iDRAC. Еще можно через умную розетку подключить, тоже бывает полезно.

pekmop1024 ★★★★★
()
Последнее исправление: pekmop1024 (всего исправлений: 1)
Ответ на: комментарий от pekmop1024

Оно как будто оверкилл для моей задачи. Решение с сишным кодом в лоб выглядит проще.

С умной розеткой чуть сложнее - оно сейчас подключено через UPS, городить поверх него еще розетку, можно, конечно, но попробую ограничиться программным подходом.

Jefail ★★★★★
() автор топика
Ответ на: комментарий от firkax

Хмм, после небольшого гугла возник вопрос, а это будет чем-то отличаться от такой конфигурации?

sysctl -w kernel.softlockup_panic=1
sysctl -w kernel.panic=10

То есть по сути, когда watchdog обнаружит soft lockup - ядро уйдет в панику, а Kernel Panic инициирует перезагрузку через 10 секунд.

Jefail ★★★★★
() автор топика
Ответ на: комментарий от Jefail

С умной розеткой чуть сложнее - оно сейчас подключено через UPS, городить поверх него еще розетку, можно, конечно, но попробую ограничиться программным подходом.

У меня есть и то и то, но я розетки юзаю, чтобы метрики потребления в VictoriaMetrics писать и через графану смотреть. Технически для резета использовать можно, но не приходилось - фингербота хватает. А что касается UPS, никто не запрещает в него воткнуть фильтр, в который натыкать сколько нужно умных розеток вроде Shelly Smart Plug S. В идеале, конечно, хотелось бы сразу умный фильтр или еще лучше умный UPS, но в консумерском сегменте PDU не продают.

pekmop1024 ★★★★★
()
Ответ на: комментарий от Jefail

Если эта штука из-за сбоя в железе, то через 10 секунд например уже всё целиком может висеть и ребут будет некому делать. Ну и я не знаю с помощью через делается ребут при panic, нет ли там варианта что он не сможет сделаться (надо посмотреть исходники).

Лучше поставить panic=-1 чтобы ребуталось сразу. И проверить чтобы он не тратил время на сохранение каких-нить дампов на диск перед этим.

firkax ★★★★★
()
Ответ на: комментарий от Jefail

IMHO в твоём случае этого должно хватать.
Либо использовать какой-нибудь аппаратный watchdog.
На крайний случай собрать на arduino + реле/ключ который подключить параллельно кнопке reset.

На хабре есть пример такой поделки.

vel ★★★★★
()
Ответ на: комментарий от pekmop1024

Если бы была обычная ATX плата, то все проблемы решились бы Sipeed NanoKVM (https://wiki.sipeed.com/hardware/en/kvm/NanoKVM/introduction.html)

Это отдельный дешевый аппаратный kvm, на опенсорсной прошивке подключающийся к hdmi и usb порту к компу. У него в full варианте есть отдельная плата NanoKVM-B, которая подключается в разрыв к штырькам на ATX плат, куда подключаются кнопка резета и благодаря этому можно удаленно резетать компьютер выводя его из любых зависаний. Внутри есть sd карточка, куда можно записать livecd образ и не просто ребутать компьютер, надеясь, что он оживет, но и загрузить компьютер с этого образа и полноценно его восстановить даже в том случае, если на нем полетит файловая система.

Стоит удовольствие ~4000 руб.

Если на mini pc нестандартная материнка, то удаленно ребутать без колхоза не получится.

Darfin
()