Ошибка «Thread starvation» и «Watchdog»: когда сервер зависает намертво
Введение: сервер в коме
Ошибка «Thread starvation» или сообщение от Watchdog «The server has not responded for X seconds» означает, что главный поток сервера заблокирован и не может обрабатывать тики. Сервер не крашится, но полностью зависает: игроки не могут двигаться, консоль не отвечает на команды. Это состояние может длиться минутами. В этом гайде — что вызывает thread starvation и как настроить Watchdog для автоматического восстановления.
Как работает Watchdog
Watchdog (сторожевой пёс) — это механизм в Paper/Purpur, который мониторит главный поток сервера. Если поток не отвечает более 60 секунд (по умолчанию), Watchdog выводит дамп потоков (thread dump) в консоль, чтобы вы могли увидеть, какой именно код заблокировал сервер.
Причина 1: Операция записи на диск (I/O)
Сохранение мира, запись логов, бэкап — всё это операции ввода-вывода. Если диск медленный или перегружен, операция записи может заблокировать главный поток на несколько секунд или даже минут.
Решение:
- В
paper.ymlвключите асинхронное сохранение:async-chunks: true. - Используйте SSD/NVMe-диск.
- Не запускайте бэкапы и антивирусное сканирование во время работы сервера.
Причина 2: Плагин выполняет тяжёлую операцию в главном потоке
Плагин загружает данные из базы данных, парсит большой файл, генерирует карту — и всё это в главном потоке. Пока операция не завершится, сервер висит.
Решение:
- Используйте Spark для профилирования потоков:
/spark profiler start --thread *. - Найдите плагин, который заблокировал поток (в дампе Watchdog будет указан стектрейс).
- Обновите плагин или сообщите разработчику о проблеме.
Причина 3: Сборщик мусора (GC) остановил мир
Если используется неправильный GC или памяти недостаточно, сборщик мусора может выполнять «stop-the-world» паузы на 10-30 секунд.
Решение:
- Используйте флаги Aikar (см. гайд «Java Heap Space»).
- Используйте G1GC с ограничением пауз:
-XX:MaxGCPauseMillis=200.
Настройка Watchdog
В paper.yml:
watchdog:
early-warning-every: 5000 # предупреждение каждые 5 секунд
early-warning-delay: 10000 # первое предупреждение через 10 секунд
early-warning-length: 30000 # через 30 секунд — принудительный дамп
timeout: 60 # таймаут в секундах
Уменьшите timeout до 30 секунд, чтобы быстрее получать дамп и диагностировать проблему.
💡 Совет профи
Настройте автоматический перезапуск сервера при thread starvation. Система мониторинга (скрипт или плагин) проверяет TPS сервера каждые 10 секунд. Если TPS = 0 в течение 60 секунд — сервер автоматически перезапускается. Это не решит причину, но вернёт игроков в игру быстрее, чем ручной перезапуск администратором.
💬 Комментарии (0)
🔒 Войдите, чтобы оставить комментарий
😊 Пока нет комментариев. Будьте первым!