Postgresql 8.3: Limitar o consumo de recursos por consulta

12

Estou usando o PostgreSQL 8.3 + PostGIS 1.3 para armazenar dados geoespaciais no Ubuntu 8.04 Hardy .

Esta versão específica do PostGIS tem um erro ao calcular buffer()segmentos muito complexos, o que faz com que a consulta consiga mais e mais memória até que toda a máquina fique presa.

Estou procurando um mecanismo PostgreSQL que possa:

  • Limite o consumo de memória (e talvez outros recursos) usado por uma consulta específica.
  • Interrompa automaticamente consultas cujo tempo de execução exceda um determinado limite.

Alguma ideia?

Adam Matan
fonte
Por que você continua usando uma versão com um bug que o morde? Use uma versão corrigida e seu problema se foi.
21411 Frank Heikens
É verdade, mas às vezes há erros em nosso código ou apenas consultas que demoram demais. Eu quero que eles morram com a mensagem de erro de log.
Adam Matan

Respostas:

9

Para limitar o consumo de memória, o principal parâmetro de configuração é work_mem. Como isso se aplica por operação, não por consulta, você não pode simplesmente defini-lo como N se quiser gastar uma quantidade de memória N, mas precisa ajustar e ajustá-lo um pouco para obter o resultado desejado.

Isso não ajuda, no entanto, no caso de erros e outras falhas de memória no código ou nas extensões do servidor. Você pode controlar isso com os limites de recursos específicos do processo controlados por ulimit. Mas se você atingir o limite e a alocação de memória falhar, o que você deseja que aconteça? Provavelmente não se comportará muito bem. Melhor corrigir esses bugs ou usar uma versão diferente.

As consultas de interrupção cujo tempo de execução ultrapassou um limite, usam o parâmetro `statement_timeout ', por exemplo,

SET statement_timeout TO '10min';
Peter Eisentraut
fonte
Ótimo. É mesmo o que eu procurava.
Adam Matan
2

Dê uma olhada no Wiki do Postgres :

O PostgreSQL não possui recursos para limitar quais recursos um usuário, consulta ou banco de dados em particular consome, ou para definir prioridades de forma que um usuário / consulta / banco de dados obtenha mais recursos que outros. É necessário usar as instalações do sistema operacional para alcançar o que é possível priorizar limitado.

Você pode ajustar as configurações de desempenho por usuário ou por banco de dados, mas não quando interromper determinadas consultas.

DrColossos
fonte
+1 Que tal definir um máximo para a quantidade de memória que todo o cluster pode consumir?
Adam Matan