LWLock:pg_stat_statements - Amazon Relational Database Service

LWLock:pg_stat_statements

O evento de espera LWLock:pg_stat_statements ocorre quando a extensão pg_stat_statements obtém um bloqueio exclusivo na tabela de hash que rastreia instruções SQL. Isso acontece nos seguintes cenários:

  • Quando o número de instruções rastreadas atinge o valor configurado do parâmetro pg_stat_statements.max e é necessário abrir espaço para mais entradas, a extensão executa uma classificação no número de chamadas, remove 5% das instruções menos executadas e preenche novamente o hash com as entradas restantes.

  • Quando pg_stat_statements executa uma operação garbage collection no arquivo pgss_query_texts.stat no disco e reescreve o arquivo.

Versões compatíveis do mecanismo

É possível obter informações sobre eventos de espera em todas as versões do RDS para PostgreSQL.

Contexto

Conceitos básicos sobre a extensão pg_stat_statements: essa extensão rastreia as estatísticas de execução de instruções SQL em uma tabela de hash. Ela rastreia as instruções SQL até o limite definido pelo parâmetro pg_stat_statements.max. Esse parâmetro determina o número máximo de instruções que podem ser rastreadas, o qual corresponde ao número máximo de linhas na visualização pg_stat_statements.

Persistência das estatísticas de instrução: a extensão mantém as estatísticas da instrução em todas as reinicializações da instância:

  • Gravando dados em um arquivo chamado pg_stat_statements.stat.

  • Usando o parâmetro pg_stat_statements.save para controlar o comportamento de persistência.

Quando pg_stat_statements.save é definido como:

  • ativado (padrão): as estatísticas são salvas no desligamento e recarregadas na inicialização do servidor.

  • desativado: as estatísticas não são salvas no desligamento nem recarregadas na inicialização do servidor.

Armazenamento de texto de consulta: a extensão armazena o texto das consultas rastreadas em um arquivo chamado pgss_query_texts.stat. Esse arquivo pode aumentar até o dobro do tamanho médio de todas as instruções SQL rastreadas antes que a coleta de resíduos ocorra. A extensão requer um bloqueio exclusivo na tabela de hash durante as operações de limpeza e regravação do arquivo pgss_query_texts.stat.

Processo de desalocação de instruções: quando o número de instruções rastreadas atinge o limite pg_stat_statements.max e novas instruções precisam ser rastreadas, a extensão:

  • Obtém um bloqueio exclusivo (LWLock:pg_stat_statements) na tabela de hash.

  • Carrega os dados existentes na memória local.

  • Executa uma classificação rápida com base no número de chamadas.

  • Remove as instruções menos chamadas (5% inferiores).

  • Preenche novamente a tabela de hash com as entradas restantes.

Monitoramento da desalocação de instruções: no PostgreSQL 14 e versões posteriores, você pode monitorar a desalocação de instruções usando a visualização pg_stat_statements_info. Essa visualização inclui uma coluna de desalocação que mostra quantas vezes as instruções foram desalocadas para abrir espaço para novas.

Se a desalocação de instruções ocorrer com frequência, haverá uma coleta de resíduos mais frequente do arquivo pgss_query_texts.stat no disco.

Possíveis causas do maior número de esperas

As causas típicas do aumento de esperas LWLock:pg_stat_statements incluem:

  • Um aumento no número de consultas exclusivas usadas pela aplicação.

  • O valor do parâmetro pg_stat_statements.max é pequeno em comparação ao número de consultas exclusivas que estão sendo usadas.

Ações

Recomenda-se ações distintas, dependendo dos motivos do evento de espera. Você pode identificar eventos LWLock:pg_stat_statements utilizando o Insights de Performance do Amazon RDS ou consultando a visualização pg_stat_activity.

Ajuste os parâmetros pg_stat_statements a seguir para controlar o comportamento de rastreamento e reduzir os eventos de espera das instruções LWLock:pg_stat_.

Desabilitar o parâmetro pg_stat_statements.track

Se o evento de espera LWLock:pg_stat_statements estiver afetando negativamente o desempenho do banco de dados e for necessária uma solução rápida antes de uma análise mais aprofundada da visualização pg_stat_statements para identificar a causa-raiz, o parâmetro pg_stat_statements.track poderá ser desabilitado configurando-o como none. Isso desabilitará a coleta de estatísticas de instrução.

Aumentar o parâmetro pg_stat_statements.max

Para reduzir a desalocação e minimizar a coleta de resíduos do arquivo pgss_query_texts.stat no disco, aumente o valor do parâmetro pg_stat_statements.max. O valor padrão é 5,000.

nota

O parâmetro pg_stat_statements.max é estático. É necessário reinicializar a instância de banco de dados para aplicar qualquer alteração nesse parâmetro.

Desabilitar o parâmetro pg_stat_statements.track_utility

Você pode analisar a visualização pg_stat_statements para determinar quais comandos do utilitário estão consumindo mais recursos rastreados por pg_stat_statements.

O parâmetro pg_stat_statements.track_utility controla se o módulo rastreia os comandos do utilitário, que incluem todos os comandos, exceto SELECT, INSERT, UPDATE, DELETE e MERGE. Esse parâmetro é definido como on por padrão.

Por exemplo, quando sua aplicação usa muitas consultas de ponto de salvamento, que são inerentemente exclusivas, ela pode aumentar a desalocação de instruções. Para resolver isso, você pode desabilitar o parâmetro pg_stat_statements.track_utility para impedir que pg_stat_statements rastreie consultas de pontos de salvamento.

nota

O parâmetro pg_stat_statements.track_utility é dinâmico. Você pode alterar o respectivo valor sem reiniciar a instância de banco de dados.

exemplo Exemplo de consultas exclusivas de ponto de salvamento em pg_stat_statements
query | queryid -------------------------------------------------+--------------------- SAVEPOINT JDBC_SAVEPOINT_495701 | -7249565344517699703 SAVEPOINT JDBC_SAVEPOINT_1320 | -1572997038849006629 SAVEPOINT JDBC_SAVEPOINT_26739 | 54791337410474486 SAVEPOINT JDBC_SAVEPOINT_1294466 | 8170064357463507593 ROLLBACK TO SAVEPOINT JDBC_SAVEPOINT_65016 | -33608214779996400 SAVEPOINT JDBC_SAVEPOINT_14185 | -2175035613806809562 SAVEPOINT JDBC_SAVEPOINT_45837 | -6201592986750645383 SAVEPOINT JDBC_SAVEPOINT_1324 | 6388797791882029332

O PostgreSQL 17 inclui vários aprimoramentos para o rastreamento de comandos de utilitário:

  • Os nomes de ponto de salvamento agora são exibidos como constantes.

  • Os IDs de transação global (GIDs) dos comandos de confirmação em duas fases agora são exibidos como constantes.

  • Os nomes das instruções DEALLOCATE são mostrados como constantes.

  • Os parâmetros CALL agora são exibidos como constantes.