ogurexxx@root:~$ cat postmortem.md
Инциденты
Сайт работает на собственном сервере, и иногда он падает. Здесь — честные разборы: что случилось, почему, что сработало и что исправлено. Без поиска виноватых, с выводами.
сейчас: всё работает
90 дней назад30 дней назадсегодня
Сервер перестал отвечать на 16 часов
Сайт и все сервисы на сервере были недоступны около 16 часов. Наиболее вероятная причина — системный накопитель перестал отвечать после двух с половиной суток непрерывной записи ошибок несовместимого драйвера видеокарты в журнал. Сервер не перезагрузился сам, а о падении я узнал только через 8 часов.
Хронология (МСК)
- 25.10 05:02Сервер загружается. С первой секунды драйвер видеокарты пытается инициализировать карту, падает и пробует снова — примерно раз в секунду. Каждая ошибка пишется в системный журнал.
- 25–27.10За 57 часов — 185 000 ошибок, журнал вырастает почти до 1 ГБ на системном накопителе. Внешне всё работает.
- 26.10 23:24Последняя проверка, при которой сайт точно работал.
- 27.10 14:00:22Последняя запись в журнале — обрыв на полуслове, без штатного выключения. Сервер перестаёт отвечать.
- 27.10 ~22:15Недоступность замечена при плановой проверке сайта. Внешние проверки из четырёх стран: «No route to host».
- 28.10 06:15Сервер перезагружен вручную. Все сервисы, включая сайт, поднялись автоматически.
- 28.10Расследование по журналам и исправления — см. ниже.
Причина
На сервере был установлен драйвер видеокарты, который не поддерживает установленную в нём старую видеокарту. Служба, следящая за драйвером, перезапускала его по кругу, и каждый круг давал новые записи в журнале. Двое с половиной суток непрерывной записи — тяжёлая нагрузка для системного накопителя; наиболее вероятно, он перестал отвечать, и журнал оборвался, потому что писать стало некуда.
Что осталось невыясненным
Версия с накопителем объясняет обрыв журнала и то, что сторожевой таймер не сработал: ядро продолжало его «кормить». Но внешние проверки получали «No route to host» — обычно это значит, что сервер не отвечал даже на сетевом уровне, чего при зависшем только накопителе быть не должно. Прямых улик нет и быть не может: журнал хранился на том же накопителе. Поэтому причина названа наиболее вероятной, а не доказанной.
Почему простой был таким долгим
- Сторожевой таймер был включён (5 минут), но не сработал: судя по всему, ядро продолжало подавать сигнал «жив».
- Мониторинг доступности работал на том же сервере — и завис вместе с ним. Уведомлений не было.
- Ошибки драйвера шли с момента загрузки, но журнал никто не читал: шум не был виден, пока не стал аварией.
Что сработало хорошо
- После перезагрузки все сервисы поднялись сами — ничего не пришлось запускать вручную.
- Данные не пострадали: диск с данными исправен, сайт не хранит состояния, которое могло бы повредиться.
- Журналы сохранились до последней секунды перед сбоем — по ним удалось восстановить картину.
Что исправлено
- [x] Несовместимый драйвер видеокарты удалён: ошибок в журнале больше нет.
- [x] Журнал ограничен 100 МБ, накопившиеся 933 МБ удалены.
- [x] Сторожевой таймер — 30 секунд вместо 5 минут.
- [x] Внешняя проверка доступности сайта — со стороннего сервиса, а не с этого же сервера: при падении приходит уведомление.
Выводы
- Мониторинг, живущий на том же сервере, не увидит падения самого сервера.
- Сторожевой таймер ловит не все зависания — только те, при которых останавливается ядро.
- Бесконечный поток ошибок в журнале — это не косметика, а угроза надёжности.