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

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

Холодный кэш (сразу после перезапуска) Cold buffer pool after restart

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

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

После перезапуска БД кэш в памяти пуст, и какое-то время все запросы читают данные с диска.

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

Симптомы
Ошибка входа / бесконечная загрузка, Задержка ввода
Факторы
Задержка
У кого
Весь сервер
Когда
Сразу после входа или техработ
Ответственные
Основной ответственный Команда инфраструктуры · Инфраструктура БД · Совместно Команда разработки · Разработка сервера
Команда разработки: задачи
Открывать сервер постепенно (через очередь на вход поэтапно увеличивать число входящих игроков).
Команда инфраструктуры: задачи
Прогревать кэш после перезапуска (проверить настройки сохранения и восстановления буферного пула), у БД, восстановленной из снапшота, заранее прочитать и диск.
На графике
Всплеск сразу после входа или техработ · чтение с диска, доля попаданий в буферный кэш
Где смотреть
В MySQL смотреть отношение Innodb_buffer_pool_reads (сколько раз данных не было в буферном пуле и пришлось читать с диска) к Innodb_buffer_pool_read_requests и ход прогрева в Innodb_buffer_pool_load_status. В PostgreSQL смотреть blks_read и blks_hit в pg_stat_database. Смотреть и число чтений с диска на сервере БД
Подтверждает
Сразу после перезапуска чтение с диска подскакивает, доля попаданий низкая и со временем восстанавливается, и на этом отрезке медленно проходят вход и загрузка
Опровергает
Если доля попаданий обычная, а после техработ всё медленно, это наплыв входов и N+1 (db-login-storm) или пул соединений (db-pool)
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
MySQL при выключении сохраняет список страниц буферного пула, а при запуске в фоне читает их заново, но на полное заполнение нужно время. Если в облаке БД восстановлена из снапшота (копии диска), то и сам диск медленно отдаёт каждый блок при первом чтении, и прогрев затягивается ещё сильнее.
Реальные инциденты
Roblox 2021: Сбой Roblox на 73 часа: конкуренция в кластере service discovery (Consul)

Источники

  1. Saving and Restoring the Buffer Pool State MySQL
    Чтобы сократить прогрев после перезапуска, при выключении сохраняется список недавно использованных страниц (по умолчанию 25%), а при запуске они читаются заново. Обе функции включены по умолчанию
  2. pg_prewarm — preload relation data into buffer caches PostgreSQL
    Содержимое общих буферов периодически записывается, а после перезапуска загружается обратно (autoprewarm)
  3. Initialize Amazon EBS volumes AWS
    Том, созданный из снапшота, пока не подтянет все блоки, работает с повышенной задержкой и пониженной производительностью
  4. Server Status Variables MySQL
    Innodb_buffer_pool_reads (число логических чтений, которые не нашли данных в буферном пуле и читали напрямую с диска), Innodb_buffer_pool_read_requests, Innodb_buffer_pool_load_status (ход прогрева)
  5. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    blks_read (число блоков, прочитанных с диска) и blks_hit (число блоков, найденных в буферном кэше) в pg_stat_database

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

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

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

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