Estamos vendo commits aguardando excessivamente WALWrite
durante determinados momentos de alta carga. Não apenas certas sessões, mas todos os commits, até mesmo o vácuo. Ao tirar fotos pg_stat_all_tables
, acho que pg_statio_all_tables
fica claro que durante esses momentos específicos, onde os WALWrite
eventos são tão proeminentes, a culpa é de uma mesa em particular e sua mesa de brindes. WALWrite
Ele recebe inserções, atualizações e exclusões pesadas durante os momentos em que há muitas esperas. 'Pesado' tanto em termos de muitas sessões (cerca de 20) quanto em termos de quantidade de dados (grandes campos de texto que são torrados).
Olhando os instantâneos dos pg_stat_wal
momentos em que as esperas acontecem, posso ver que:
wal_records
por segundo subiu de uma média de 2.000 para 10.000-20.000wal_fpi
por segundo subiu de uma média de 150 para 500-1.000wal_kbytes
por segundo subiu de uma média de 600 para 3.000-5.000wal_write
ewal_sync
por segundo subiram de uma média de 50 para 200
Os números mencionados acima indicam pg_stat_wal
qual é o motivo dos eventos WALWrite?
- É o número de commits por segundo?
- É o tamanho dos commits (em megabytes)?
- É o número de sessões que são confirmadas ao mesmo tempo?
Se esses números não retratam uma imagem clara, como posso descobrir? Gostaria de consertar o gargalo, mas preciso identificá-lo primeiro.
Atualização nas especificações
- PG 14.1 no AWS RDS (db.r6i.4xlarge (16 vCPU, 128 GB de RAM) com 1 réplica (db.r6i.2xlarge).
- O tipo de armazenamento é SSD de uso geral (gp3) com IOPS provisionados de 12.000 IOPS e taxa de transferência de armazenamento de 500 MiBps.
- SEM volume de log dedicado para PostgreSQL
checkpoint_timeout
900max_wal_size
15360min_wal_size
8192synchronous_standby_names
NULOwal_level
réplicawal_buffers
64 MBshared_buffers
32 GBwal_compression
SOBREcommit_delay
0synchronous_commit
SOBRE
Isso quase certamente significa que seu disco está sobrecarregado. Você pode ajustar sua carga de trabalho para ter menos intensidade de E/S, caso contrário, precisará de melhor armazenamento.
Você pode tentar ativar o
wal_compression
, o que pode reduzir um pouco o volume do WAL, às custas do tempo da CPU.