한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Анатомия игровых лагов › L9 Процесс игрового сервера

Бесконечный цикл и неконтролируемая логика Infinite loop / runaway logic

ID причины sp-infinite-loop · Основной ответственный Команда разработки · Разработка сервера

Открыть карточку в основной версии с иллюстрациями и экспериментами →

Если из-за бага тик не заканчивается, сервер встаёт, и watchdog принудительно его перезапускает.

Почему Из-за ошибочного условия цикл не завершается, или рекурсия уходит вразнос → Следствие Тик не заканчивается, сервер стоит → На экране Фриз, затем дисконнект у всех

Симптомы
Фриз, Дисконнект
Факторы
Остановка
У кого
Одна локация или канал, Весь сервер
Когда
При определённом действии, Изредка, случайно
Ответственные
Основной ответственный Команда разработки · Разработка сервера
Команда разработки: задачи
Ограничить число итераций, поставить watchdog, написать тесты, воспроизводящие проблемный ввод.
На графике
Массовый обрыв соединений · число подключений, CPU по потокам
Где смотреть
Во время зависания посмотреть CPU по потокам через pidstat -t 1 и проверить через perf top -t (ID потока) или gdb, в какой функции крутится поток на 100%. Если сервер уже перезапущен, искать записи о срабатывании watchdog (WatchdogSec в systemd, проваленная liveness-проверка в Kubernetes)
Подтверждает
Пока сервер стоит, один игровой поток держится на 100% CPU, а его стек всё время крутится внутри одной функции или цикла
Опровергает
Если во время зависания загрузка CPU близка к 0, дело в дедлоке или ожидании внешнего ответа
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)

Источники

  1. systemd.service(5) — Linux manual page systemd
    WatchdogSec=: если сервис не отправит сигнал жизни (WATCHDOG=1) за заданное время, он считается сбойным и завершается, а затем в зависимости от настройки Restart= автоматически перезапускается
  2. Liveness, Readiness, and Startup Probes Kubernetes
    Состояние, когда приложение работает, но не продвигается, ловят liveness-проверкой и перезапускают. По умолчанию проверка идёт каждые 10 секунд, а после 3 неудач подряд следует перезапуск
  3. pidstat(1) — Linux manual page sysstat
    -t дополнительно выводит статистику по потокам процесса (загрузку CPU и т. п.)
  4. perf-top(1) — Linux manual page perf
    В реальном времени показывает долю CPU работающего потока (-t) или процесса (-p) по функциям (символам)

Смотрите также

Тот же слой: L9 Процесс игрового сервера

Причины с тем же симптомом (Фриз) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами