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

Анатомия игровых лагов › Проблемы только у части игроков

Раздутые данные отдельного персонажа One character with oversized data (inventory, mail, buffs)

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

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

У персонажа, у которого накопились тысячи предметов и писем или необычно много друзей, записей в чёрном списке и баффов, данных для загрузки при входе, сохранения и рассылки окружающим в разы больше, чем у других. Тормозит только этот персонаж, независимо от подключения.

Почему У давно прокачиваемого персонажа в инвентаре и почте скопились тысячи предметов или наград за события → Следствие При каждом входе, переходе между локациями и сохранении приходится читать и писать в БД соответствующий объём, и данные о снаряжении и баффах для рассылки окружающим тоже большие → На экране Только у этого персонажа долгая загрузка при входе и замирания при открытии инвентаря или почты. Если сервер ждёт сохранения в игровом потоке, на мгновение замирают и окружающие

Симптомы
Ошибка входа / бесконечная загрузка, Задержка ввода, Фриз
Факторы
Остановка
У кого
Только у меня, Только одна функция
Когда
Сразу после входа или техработ, При определённом действии, В движении и при смене локации
Ответственные
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Инфраструктура БД
Команда разработки: задачи
Ввести лимиты на хранение в инвентаре и почте и автоочистку старых писем, загружать данные частями по мере надобности, сохранять только изменения и вне игрового потока.
Команда инфраструктуры: задачи
Найти в логе медленных запросов повторяющиеся медленные чтения по одному и тому же персонажу и передать команде разработки, предоставить топ персонажей по числу строк предметов и писем.
Цифры для ориентира
Если один предмет занимает одну строку в БД, персонаж с 5 000 предметов при каждом входе читает 5 000 строк. Это в десятки раз больше, чем у обычного персонажа.
На графике
Высоко только у некоторых · время входа и сохранения по персонажам, число строк, читаемых из БД, по персонажам
Где смотреть
Найти в логе медленных запросов БД (MySQL slow query log, PostgreSQL log_min_duration_statement) медленные чтения и сохранения, повторяющиеся с одним и тем же ID персонажа, и выгрузить топ персонажей по числу строк в таблицах предметов и писем
Подтверждает
Медленные запросы сосредоточены на нескольких ID персонажей, у этих персонажей строк предметов и писем в десятки раз больше среднего, и при входе с другого ПК и подключения они тормозят так же
Опровергает
Если вместе тормозят и другие персонажи того же аккаунта или другие игроки, причина в серверах БД или блокировках. Если на другом ПК с этим персонажем всё нормально, причина в окружении игрока
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
Если тот же персонаж тормозит так же при входе с другого ПК и подключения, а другие персонажи того же аккаунта в порядке, подозревают данные персонажа. Поэтому в жалобе обязательно нужно имя персонажа.

Источники

  1. Extraneous Fetching antipattern Microsoft Azure
    Если извлекать больше данных, чем нужно, растёт нагрузка на ввод-вывод и замедляются ответы
  2. PostgreSQL Documentation: Error Reporting and Logging PostgreSQL
    log_min_duration_statement: записывает SQL, который выполнялся дольше заданного времени, для отслеживания медленных запросов
  3. The Slow Query Log MySQL
    Лог медленных запросов, куда пишутся запросы дольше long_query_time

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

Тот же слой: Проблемы только у части игроков

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

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