O BD grava periodicamente no disco, de uma vez, as alterações acumuladas na memória, e nesse momento as queries ficam lentas.
Por quê As alterações se acumulam e são gravadas no disco periodicamente → Efeito Nesse momento o disco fica ocupado e as queries atrasam → Na tela Salvamentos e carregamentos ficam lentos em intervalos regulares
Responsável principal Infraestrutura de banco de dados (Equipe de infraestrutura)
O que fazer (Equipe de infraestrutura)
Dividir os checkpoints em partes menores e espalhá-los, dar folga ao log de transações (redo log, WAL), usar disco rápido.
No gráfico
Picos em intervalos regulares · Latência das queries do BD, volume de escrita no disco
Onde olhar
No PostgreSQL, ver no log do log_checkpoints (ativo por padrão nas versões recentes) o horário de cada checkpoint e o número de buffers gravados, o número de checkpoints (num_timed e num_requested do pg_stat_checkpointer a partir da 17; checkpoints_timed e checkpoints_req do pg_stat_bgwriter na 16 e anteriores) e os avisos de checkpoint_warning. No MySQL, ver na seção LOG do SHOW ENGINE INNODB STATUS a diferença entre Log sequence number e Last checkpoint at. Sobrepor o volume e a latência de escrita no disco do servidor
Confirma se
Os picos de latência das queries coincidem com os checkpoints, e nesse momento o volume e a latência de escrita no disco disparam. No PostgreSQL, se os checkpoints por requisição (num_requested) forem muito mais numerosos que os por tempo (num_timed), o WAL está batendo com frequência no max_wal_size e antecipando os checkpoints
Descarta se
Picos em intervalos sem relação com os checkpoints: backup ou jobs em lote (dk-backup, db-batch)
Como verificar
Ferramentas de infra (sem precisar do código do jogo)
Saiba mais
Se o log de transações que guarda o registro das alterações (redo log no MySQL, WAL no PostgreSQL) for pequeno demais, o BD faz checkpoints às pressas toda vez que o log enche, e a vazão de escrita cai muito por alguns instantes.
Fontes
WAL Configuration (PostgreSQL Documentation)PostgreSQL Checkpoint a cada 5 minutos ou 1 GB de WAL (max_wal_size) por padrão; é caro porque grava todas as páginas sujas. checkpoint_completion_target distribui as escritas e evita picos de I/O. Se o intervalo entre checkpoints for menor que checkpoint_warning, um aviso no log recomenda aumentar o max_wal_size
Configuring Buffer Pool FlushingMySQL Quando o redo log enche, um checkpoint às pressas (sharp checkpoint) derruba a vazão por um momento; o flush adaptativo distribui as escritas de forma uniforme