LWLock:BufferIO (IPC:BufferIO)
O evento LWLock:BufferIO
ocorre quando o Aurora PostgreSQL ou o RDS for PostgreSQL aguarda outros processos terminarem suas operações de entrada/saída (E/S) ao tentarem acessar simultaneamente uma página. Sua finalidade é fazer com que a mesma página seja lida no buffer compartilhado.
Versões de mecanismos relevantes
Essas informações de evento de espera são relevantes para todas as versões do Aurora PostgreSQL. Para o Aurora PostgreSQL 12 e versões anteriores, esse evento de espera é denominado lwlock:buffer_io, ao passo que, no Aurora PostgreSQL versão 13, é denominado lwlock:bufferio. A partir do Aurora PostgreSQL versão 14, o evento de espera BufferIO foi movido do tipo de evento de espera LWLock
para IPC
(IPC:BufferIO).
Contexto
Cada buffer compartilhado tem um bloqueio de E/S associado ao evento de espera LWLock:BufferIO
, todas as vezes que um bloqueio (ou uma página) precisa ser recuperado fora do grupo de buffer compartilhado.
Esse bloqueio é utilizado para lidar com várias sessões que requerem acesso ao mesmo bloco. Esse bloco precisa ser lido de fora do grupo de buffer compartilhado, definido pelo parâmetro shared_buffers
.
Assim que a página for lida dentro do grupo de buffer compartilhado, o bloqueio de LWLock:BufferIO
será liberado.
nota
O evento de espera LWLock:BufferIO
precede o evento de espera IO:DataFileRead. O evento de espera IO:DataFileRead
ocorre enquanto os dados estão sendo lidos do armazenamento.
Para obter mais informações sobre bloqueios leves, consulte Visão geral de bloqueios
Causas
Causas comuns do surgimento do evento LWLock:BufferIO
nas principais esperas incluem:
-
Vários backends ou conexões tentando acessar a mesma página para a qual também há uma operação de E/S pendente
-
A proporção entre o tamanho do grupo de buffer compartilhado (definido pelo parâmetro
shared_buffers
) e o número de buffers necessários para a workload atual -
O tamanho do grupo de buffer compartilhado não está bem equilibrado com o número de páginas que estão sendo despejadas por outras operações
-
Índices grandes ou inchados que exigem que o mecanismo leia mais páginas que o necessário no grupo de buffer compartilhado
-
Ausência índices, o que força o mecanismo de banco de dados a ler mais páginas das tabelas que o necessário
-
Picos repentinos de conexões de banco de dados tentando realizar operações na mesma página
Ações
Recomenda-se ações distintas, dependendo dos motivos do evento de espera:
-
Observe as métricas do Amazon CloudWatch para encontrar uma correlação entre reduções acentuadas nos eventos de espera
BufferCacheHitRatio
eLWLock:BufferIO
. Esse efeito pode significar que existe uma pequena configuração de buffers compartilhados. Talvez seja necessário aumentá-lo ou aumentar a escala da classe de instância de banco de dados na vertical. Você pode dividir sua workload em mais nós de leitura. -
Ajuste
max_wal_size
echeckpoint_timeout
com base no horário de pico da workload, se você virLWLock:BufferIO
correspondendo a quedas da métricaBufferCacheHitRatio
. Em seguida, identifique qual consulta pode estar causando isso. -
Verifique se existem índices não utilizados e remova-os.
-
Use tabelas particionadas (que também tenham índices particionados). Fazer isso ajuda a manter a reordenação do índice baixo e reduz seu impacto.
-
Evite indexar colunas desnecessariamente.
-
Evite picos repentinos de conexão de banco de dados utilizando um grupo de conexões.
-
Restrinja o número máximo de conexões com o banco de dados como prática recomendada.