Estou executando o Postgres 14.6 e tenho várias sessões com um wait event
descrito como Timeout: VacuumDelay
. O SQL sendo executado pela sessão é....
autovacuum: VACUUM public.mytable_202110 (to prevent wraparound)
(essas informações são obtidas no painel do pgAdmin4)
eu tenho uma série de perguntas
- Essas sessões estão destacadas em vermelho, isso significa que há um problema?
- A consulta começou há muitas horas e o estado não mudou recentemente. Isso é significativo?
- Esta sessão está realmente me dizendo? está aspirando ativamente agora? ou está esperando a oportunidade de começar a aspirar? Ou é uma sessão não relacionada dizendo que não pode fazer nada até que o VACUUMing termine?
- A(s) tabela(s) que está(ão) sendo aspirada(s) são muito antigas, muito grandes e raramente mudam. Eles precisam ser aspirados?
Não há PIDS de bloqueio listados e todos os bloqueios foram concedidos. O banco de dados está funcionando (embora lentamente)
ATUALIZAÇÃO - isso pode ser relevante, este banco de dados acabou de ser transferido de um servidor antigo e lento para uma máquina mais nova e melhor. Eu esperava ver um desempenho significativamente melhor, mas estou supondo que as estatísticas e os dados de análise nas tabelas NÃO são transferidos com os dados originais, então o novo banco de dados está gastando muitos recursos analisando dados antigos e arquivados.
O autovacuum se autolimita, para evitar o uso de toda (ou mais do que você deseja) da capacidade de E/S do sistema. Isso é o que você está vendo. Faz sentido que, se estiver usando limitação, passe a maior parte do tempo na limitação. Afinal, seria meio inútil implementar o estrangulamento apenas para reduzi-lo em 2%. Espiar pg_stat_activity pode mostrar que está esperando no acelerador na maior parte do tempo, mas é uma chamada de suspensão diferente a cada vez, não uma chamada longa.
Talvez suas configurações de aceleração não sejam ideais para sua configuração. Você pode tornar essa execução mais rápida diminuindo autovacuum_vacuum_cost_delay ou aumentando autovacuum_vacuum_cost_limit. Infelizmente, alterar essas configurações não alterará os valores usados pelos aspiradores em execução no momento, portanto, você precisará cancelá-los para que eles possam escolher as novas configurações. E você diz que seu banco de dados já está rodando devagar, então fazer com que os aspiradores usem ainda mais recursos pode ser a direção errada a seguir.
Um vácuo "(para evitar o wraparound)" precisa acontecer uma vez a cada 2 bilhões de transações, mesmo que a tabela seja grande, antiga e raramente mude. Se quase todas as páginas estiverem marcadas como congeladas, fazer esse vácuo deve ser muito rápido - mas isso não ajuda na primeira vez que essas tabelas são limpas para congelar tuplas.
Sim. Este não é um vácuo regular, mas um vácuo para evitar enrolamento . De vez em quando, esse vácuo processa cada mesa, bem, para evitar o enrolamento.
Ambos. Este é um aspirador funcionando ativamente que desacelera deliberadamente (na quantidade de
autovacuum_vacuum_cost_delay
tempo) para reduzir a carga no sistema.Você pode continuar trabalhando, este é um processo regular em segundo plano. No entanto, "para evitar vácuo envolvente" impedirá que você altere a estrutura da mesa devido ao bloqueio conflitante.
A exibição do sistema pg_stat_progress_vacuum pode fornecer informações mais detalhadas sobre o progresso do vácuo. Tabelas grandes, especialmente com um grande
autovacuum_vacuum_cost_delay
, podem levar vários dias para serem processadas.PS: Não faço ideia de por que o pgAdmin4 pode destacar o processo em vermelho.