В моменты, когда БД периодически сбрасывает накопленные в памяти изменения на диск, запросы замедляются.
Почему Изменения накапливаются и периодически записываются на диск → Следствие В этот момент диск занят, и запросы задерживаются → На экране Сохранения и загрузки периодически замедляются
Основной ответственный Команда инфраструктуры · Инфраструктура БД
Команда инфраструктуры: задачи
Растягивать контрольные точки мелкими равномерными порциями, делать журнал транзакций (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), слишком мал, то при каждом заполнении журнала БД в спешке делает контрольную точку, и производительность записи ненадолго сильно падает.
Источники
WAL Configuration (PostgreSQL Documentation)PostgreSQL Контрольная точка выполняется по умолчанию каждые 5 минут или каждый 1 GB WAL (max_wal_size) и стоит дорого, потому что записывает все грязные страницы. checkpoint_completion_target растягивает запись, чтобы избежать всплеска ввода-вывода. Если интервал между контрольными точками короче checkpoint_warning, в лог пишется предупреждение с советом увеличить max_wal_size
Configuring Buffer Pool FlushingMySQL Когда redo-лог заполняется, резкая (sharp) контрольная точка ненадолго снижает производительность, адаптивный сброс распределяет запись равномерно
PostgreSQL 17 Release NotesPostgreSQL Появилось представление pg_stat_checkpointer, столбцы, связанные с контрольными точками, перенесены в него из pg_stat_bgwriter