Processos Postgres rodando indefinidamente e0s barras e mau desempenho após reinstalae7e3o/restaurae7e3o

No intuito de atualizar nosso Fórum, fiz uma nova instalação de VPS + Restauração no fim de semana.

Isso resolveria vários problemas para nós:

  • Renovar o Ubuntu desatualizado
  • Atualizar o Discourse
  • Atualizar para o Postgres 15

Embora, em geral, as coisas tenham corrido bem, notei problemas depois com processos do Postgres enlouquecendo, usando 100% de um núcleo. Números variados de processos, no entanto. Tentei algumas coisas, desde uma reconstrução até reinicializações. Atualmente, estou tentando um rake db:validate_indexes, que já está rodando há algumas horas sem nenhum feedback. Não tenho certeza se já fiz isso antes e se deveria acontecer mais rápido.

Usar o fórum funciona bem basicamente, mas definitivamente ficou mais lento. Algumas tarefas de execução mais longa, como carregar perfis de usuários mais ativos, levam notavelmente mais tempo do que o normal.

Tenho quase certeza de que há alguns problemas com o banco de dados, mas estou tendo dificuldades para descobrir quais são.

Tenho que dizer que nosso banco de dados é bem grande - estamos com cerca de 150 GB após a restauração e após a criação de índices. Monitorando o processo de restauração, não vi nenhum erro e a criação de índices correu bem aos meus olhos.

Alguma ideia de como lidar com isso? São 3 processos do postgres no momento - eram 6 antes de uma reinicialização que fiz há algumas horas - já vi todos os 16 núcleos sendo usados após a restauração também.

EDIT: Acabei de notar agora que 3 processos do sidekiq estão ocupados com “indexando categorias para busca”. Pode ser tudo isso apenas a reconstrução do índice de busca? Se for, isso pode ser resolvido de outra forma? Quando fizermos a restauração do sistema em produção, isso será um grande problema se degradar o desempenho por várias horas ou até dias.

No momento, apenas uma tarefa sidekiq está em execução com "Jobs::BackfillBadge", mas ainda assim 7 processos postgres estão aparentemente bloqueando 100% da CPU constantemente. Estou realmente curioso para saber o que está acontecendo lá.

Após tais movimentações, é uma boa ideia executar um vacuum para as estatísticas do banco de dados.

Quanto de RAM e CPU você tem?

Quanto de memória você dá ao postgres?

Esse servidor de teste está com 32 GB, 16 núcleos, a configuração está definida para 64 MB de work_mem.

EDIT: Os shared buffers estão em 8 GB

Atualmente estou executando um vacuum que parece estar travado

Não tenho certeza se está fazendo algo, mas já está assim há mais de 30 minutos.

Coloquei o fórum em modo somente leitura e reiniciei a VM para encerrar os 7 processos do Postgres que estavam “travados” lá antes. Logo após a reinicialização, 2 desses processos do postgres voltaram e não mudaram. Nada rodando no sidekiq no momento.

Você realmente não quer executar um VACUUM completo. Tudo o que você precisa para recuperar o desempenho é um VACUUM VERBOSE ANALYZE. Você não pode executar um FULL em um site em execução.

Não sou especialista em bancos de dados enormes, mas eu faria os buffers duas ou três vezes maiores.

Tenho certeza que você tem índices de 8 GB.

:thinking: O Postgres recomenda nunca definir shared_buffers acima de 40% da memória interna?

Dito isso,

Seu servidor pode estar subdimensionado.

Aha! Um conselho sensato de um especialista! Então talvez eu estivesse certo que 8GB/25% não é suficiente, e embora 16GB seja mais de 40%, ainda pode ser uma boa sugestão porque . . . .

Pessoal. como dito, este é um servidor de teste - não há tráfego nele. Este servidor definitivamente não é bom o suficiente para uso em produção, mas esse não é o problema aqui. A questão é por que vemos processos do postgres travados assim (com 100% de uso de CPU) e desacelerando drasticamente as coisas. Estávamos executando o servidor de teste com capacidade menor até alguns dias atrás - ele só foi ampliado devido à falta de espaço em disco para uma restauração.

A máquina de produção está rodando com 128 GB de RAM com as mesmas configurações de Shared buffer sem nenhum problema - então não acho que haja um problema geral com essas configurações e o tamanho do Shared buffer - especialmente não em uma máquina de teste privada sem tráfego.

Mas de qualquer forma - vou refazer a restauração e ver se algo pode ter dado errado, pois aparentemente não há uma boa explicação para o comportamento.