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

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

Контрольные точки и сброс журнала Checkpoint / log flush stalls

ID причины db-checkpoint · Основной ответственный Команда инфраструктуры · Инфраструктура БД

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

В моменты, когда БД периодически сбрасывает накопленные в памяти изменения на диск, запросы замедляются.

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

Симптомы
Задержка ввода, Микрофризы
Факторы
Задержка
У кого
Весь сервер, Только одна функция
Когда
С постоянным периодом
Ответственные
Основной ответственный Команда инфраструктуры · Инфраструктура БД
Команда инфраструктуры: задачи
Растягивать контрольные точки мелкими равномерными порциями, делать журнал транзакций (redo-лог, WAL) с запасом, ставить быстрые диски.
На графике
Всплески с постоянным периодом · задержка запросов к БД, объём записи на диск
Где смотреть
Для PostgreSQL смотреть в логе log_checkpoints (в последних версиях включён по умолчанию) время контрольных точек и число записанных буферов, число контрольных точек (с версии 17 num_timed и num_requested в pg_stat_checkpointer, в 16 и ниже checkpoints_timed и checkpoints_req в pg_stat_bgwriter) и предупреждения checkpoint_warning. Для MySQL смотреть в секции LOG вывода SHOW ENGINE INNODB STATUS разницу между Log sequence number и Last checkpoint at. Накладывать на объём и задержку записи на диск сервера
Подтверждает
Всплески задержки запросов совпадают с контрольными точками, и в эти моменты подскакивают объём и задержка записи на диск. Если в PostgreSQL контрольных точек по запросу (num_requested) намного больше, чем по времени (num_timed), значит WAL часто достигает max_wal_size и контрольные точки наступают раньше срока
Опровергает
Если всплески идут с периодом, не связанным с контрольными точками, это бэкап или пакетные задания (dk-backup, db-batch)
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
Если журнал транзакций, куда записываются изменения (redo-лог в MySQL, WAL в PostgreSQL), слишком мал, то при каждом заполнении журнала БД в спешке делает контрольную точку, и производительность записи ненадолго сильно падает.

Источники

  1. WAL Configuration (PostgreSQL Documentation) PostgreSQL
    Контрольная точка выполняется по умолчанию каждые 5 минут или каждый 1 GB WAL (max_wal_size) и стоит дорого, потому что записывает все грязные страницы. checkpoint_completion_target растягивает запись, чтобы избежать всплеска ввода-вывода. Если интервал между контрольными точками короче checkpoint_warning, в лог пишется предупреждение с советом увеличить max_wal_size
  2. Configuring Buffer Pool Flushing MySQL
    Когда redo-лог заполняется, резкая (sharp) контрольная точка ненадолго снижает производительность, адаптивный сброс распределяет запись равномерно
  3. Error Reporting and Logging (PostgreSQL Documentation) PostgreSQL
    log_checkpoints: пишет в лог число записанных буферов и длительность каждой контрольной точки, по умолчанию включён
  4. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    num_timed (контрольные точки по расписанию) и num_requested (запрошенные контрольные точки) в pg_stat_checkpointer
  5. PostgreSQL 17 Release Notes PostgreSQL
    Появилось представление pg_stat_checkpointer, столбцы, связанные с контрольными точками, перенесены в него из pg_stat_bgwriter
  6. The Cumulative Statistics System (PostgreSQL 16 Documentation) PostgreSQL
    До версии 16 включительно checkpoints_timed и checkpoints_req в pg_stat_bgwriter
  7. InnoDB Standard Monitor and Lock Monitor Output MySQL
    Секция LOG: текущий номер последовательности журнала и позиция последней контрольной точки

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

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

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

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