Estou tentando fazer com que o PostgreSQL aspire automaticamente meu banco de dados de forma agressiva. No momento, configurei o aspirador automático da seguinte maneira:
- autovacuum_vacuum_cost_delay = 0 #Desativar vácuo baseado em custo
- autovacuum_vacuum_cost_limit = 10000 # Valor máximo
- autovacuum_vacuum_threshold = 50 # Valor padrão
- autovacuum_vacuum_scale_factor = 0.2 # Valor padrão
Percebo que o aspirador automático só entra em ação quando o banco de dados não está carregado, então entro em situações em que existem muito mais tuplas mortas do que tuplas vivas. Veja a captura de tela em anexo para um exemplo. Uma das tabelas possui 23 tuplas ao vivo, mas 16845 tuplas mortas aguardando vácuo. Isso é insano!
O vácuo automático entra em ação quando a execução do teste termina e o servidor de banco de dados está ocioso, o que não é o que eu quero, pois eu gostaria que o vácuo automático fosse ativado sempre que o número de tuplas mortas exceder 20% de tuplas ativas + 50, pois o banco de dados foi desativado. configurado. O aspirador automático quando o servidor está ocioso é inútil para mim, pois o servidor de produção deve atingir milhares de atualizações / s por um período prolongado e é por isso que preciso que o aspirador automático seja executado mesmo quando o servidor estiver sob carga.
Falta alguma coisa? Como forço a execução do vácuo automático enquanto o servidor está sob carga pesada?
Atualizar
Isso pode ser um problema de bloqueio? As tabelas em questão são tabelas de resumo que são preenchidas por meio de um gatilho após inserção. Essas tabelas estão bloqueadas no modo SHARE ROW EXCLUSIVE para impedir gravações simultâneas na mesma linha.
fonte
Aumentar o número de processos de autovacuum e reduzir o tempo de soneca provavelmente ajudará. Aqui está a configuração para um PostgreSQL 9.1 que eu uso em um servidor que armazena informações de backup e, como resultado, obtém muita atividade de inserção.
http://www.postgresql.org/docs/current/static/runtime-config-autovacuum.html
Também tentarei abaixar o
cost_delay
para tornar a aspiração mais agressiva.Também posso testar o vácuo automático usando o pgbench.
http://wiki.postgresql.org/wiki/Pgbenchtesting
Exemplo de alta contenção:
Criar banco de dados bench_replication
Executar pgbench
Verificar o status de aspiração automática
fonte
O script "qualificar para autovacuum" existente é muito útil, mas (conforme afirmado corretamente) estavam faltando opções específicas da tabela. Aqui está a versão modificada que leva em consideração essas opções:
fonte