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

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

Синхронные вызовы в игровом потоке Synchronous DB / file I/O on the game loop

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

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

Если посреди тика ждать ответа БД или записи в файл, на это время останавливается вся игра на сервере.

Почему Внутри тика поток ждёт запросов и сохранений в БД, записи логов, вызовов внешних API → Следствие Если БД отвечает 100 ms, тик тоже стоит 100 ms → На экране Каждый раз, когда тормозит БД или диск, вся открытая локация на миг замирает

Симптомы
Фриз, Микрофризы
Факторы
Остановка
У кого
Одна локация или канал, Весь сервер
Когда
При определённом действии, Изредка, случайно
Ответственные
Основной ответственный Команда разработки · Разработка сервера
Команда разработки: задачи
Всю медленную работу (запросы и сохранения в БД, запись логов, вызовы внешних API) выполнять асинхронно, а результат применять в следующем тике (если только поставить таймаут, на время ожидания игра всё равно встанет).
Цифры для ориентира
Даже RTT до БД в том же ЦОД 0,5 ms при 100 вызовах за тик даёт 50 ms. Это весь бюджет 20-тикового сервера.
На графике
Случайные всплески · время тика сервера, задержка запросов к БД
Где смотреть
Наложить на одну временную ось график времени тика, задержку запросов к БД (slow query log и т. п.) и задержку диска. Если метрик тика нет, смотреть через bcc offcputime -p, где ждёт игровой поток
Подтверждает
Всплески времени тика совпадают со всплесками задержки БД или файлов, а ожидание игрового потока приходится на стеки вызовов приёма ответа БД и записи в файл
Опровергает
Если задержки БД и диска ровные, а время тика скачет, дело в паузах GC или конкуренции за блокировки
Чем проверить
Нужны логи и метрики игрового сервера или клиента

Источники

  1. Designs, Lessons and Advice from Building Large Distributed Systems Google
    Пленарный доклад на LADIS 2009 (Jeff Dean). Путь туда и обратно внутри одного ЦОД около 0,5 ms (500 000 ns)
  2. ASP.NET Core Best Practices Microsoft
    Доступ к данным, ввод-вывод и долгие операции вызывать асинхронно. Синхронные блокирующие вызовы ведут к исчерпанию пула потоков и задержкам ответа
  3. Demonstrations of offcputime, the Linux eBPF/bcc version IO Visor
    Суммирует по стекам вызовов время, когда поток стоял и не был на CPU (off-CPU), процесс задаётся через -p

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

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

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

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