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