Eu tenho um servidor linux rodando apenas Postgres com PostGIS Extension. Existem vários bancos de dados nesta instância do Servidor Postrges.
Um dos bancos de dados tem algumas consultas computacionalmente intensivas executadas nele de tempos em tempos. Isso faz com que a utilização da CPU salte até 100% e o servidor geralmente não responde às solicitações.
Como evitar consultas pesadas em um banco de dados, afetando o desempenho de outros bancos de dados no mesmo servidor? Como posso garantir que outros bancos de dados nessa instância PostGres ainda respondam às solicitações? Existe uma maneira de evitar que um banco de dados consuma todos os ciclos da CPU?
Vou citar algumas coisas do wiki do Postgres, Priorities :
Considere esta parte em particular:
E especialmente este:
... teste segue ...
Então, eu diria que você deve:
primeiro, siga os conselhos acima, execute mais alguns testes de análise e certifique-se de que o gargalo seja do banco de dados que você suspeita e que seja causado por contenção de CPU (o que pode ser o caso se suas consultas forem tão caras computacionalmente). Ou pode ser parcialmente verdadeiro e há contenção de CPU, mas também espaço para melhorias de consulta.
siga o conselho do 2º parágrafo acima (melhorar as consultas, geralmente polir o cluster, verificar e otimizar as configurações de vácuo e autovacuidade.)
Você também deve otimizar as várias configurações de memória (principalmente
work_mem
) com valores diferentes para os clientes que se conectam a esse banco de dados que tem carga de trabalho diferente.Se depois de tudo isso, o problema persistir e ainda houver contenção de E/S de CPU ou disco ou ambos, existem algumas opções descritas na página de Prioridades vinculadas que você pode tentar ("renice", priorizar extensão etc.).
Uma das sugestões lá (que certamente vale a pena considerar) é separar seus bancos de dados em 2 clusters (instâncias), um para o db computacionalmente caro e outro para todo o resto, com a carga de trabalho usual. Consulte Priorizando bancos de dados separando em vários clusters , onde menciona a provável opção de limpeza:
Máquinas separadas