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

Анатомия игровых лагов › L12 База данных

Наплыв входов и запросы N+1 Login storm, N+1 queries

ID причины db-login-storm · Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Инфраструктура БД

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

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

Почему При загрузке персонажа предметы, умения и квесты запрашиваются по отдельности → Следствие Сразу после техработ одновременные входы резко увеличивают число запросов → На экране Бесконечная загрузка при входе, застревают даже сохранения тех, кто уже играет

Симптомы
Ошибка входа / бесконечная загрузка, Задержка ввода
Факторы
Остановка, Задержка
У кого
Весь сервер
Когда
Сразу после входа или техработ
Ответственные
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Инфраструктура БД
Команда разработки: задачи
Запрашивать данные одним пакетом, ввести очередь на вход, кэшировать, проверить, сколько запросов порождает ленивая загрузка в ORM.
Команда инфраструктуры: задачи
Составлять рейтинг запросов по числу вызовов и передавать его команде разработки, мониторить число запросов и соединений в часы входа сразу после техработ.
На графике
Всплеск сразу после входа или техработ · запросов к БД в секунду, число входов
Где смотреть
Накладывать число входов сразу после техработ на число запросов к БД в секунду (в MySQL прирост Questions) и считать число запросов на один вход. Запросы с наибольшим числом вызовов выбирать по COUNT_STAR в events_statements_summary_by_digest в MySQL и по calls в pg_stat_statements в PostgreSQL
Подтверждает
На один вход приходятся десятки запросов, а в топе одинаковые короткие запросы по одному ID персонажа. Если после патча число запросов на вход выросло, разбор начинают с этого патча
Опровергает
Если запросов на вход мало, но каждый медленный, это холодный кэш (db-cold-cache) или индекс (db-no-index)
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
Ленивая загрузка в ORM (библиотеке, которая сама строит запросы к БД) порождает такие запросы незаметно даже для разработчиков. На сервере разработки всего несколько персонажей, и проблемы не видно, а впервые она проявляется при одновременном входе на живых серверах.

Источники

  1. Efficient Querying .NET
    Ленивая загрузка в ORM порождает проблему N+1, когда на каждый элемент уходит ещё один запрос, и сильно снижает производительность. Рекомендуется загружать данные одним разом (eager loading)
  2. pg_stat_statements — track statistics of SQL planning and execution PostgreSQL
    Собирает число выполнений (calls) и общее время выполнения по каждому оператору, по ним составляют рейтинг самых частых запросов
  3. Performance Schema Statement Digests and Sampling MySQL
    events_statements_summary_by_digest группирует запросы одинакового вида и считает число выполнений и время
  4. Statement Summary Tables MySQL
    COUNT_STAR (число выполнений) и SUM_TIMER_WAIT (общее время) в сводных таблицах
  5. Server Status Variables MySQL
    Questions: число операторов, отправленных клиентами

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

Тот же слой: L12 База данных

Причины с тем же симптомом (Ошибка входа / бесконечная загрузка) на других слоях

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