web-dev-qa-db-fra.com

PostgreSQL 8.3: Limiter la consommation de ressources par requête

J'utilise PostgreSQL 8. + PostGis 1. Pour stocker des données géospatiales sur buntu 8.04 Hardy .

Cette version particulière de PostGis a un bug lors du calcul d'une buffer() sur des segments très complexes, ce qui entraîne la requête de prendre de plus en plus de mémoire jusqu'à ce que toute la machine soit bloquée.

Je recherche un mécanisme postgreSQL qui peut:

  • Limitez la consommation de mémoire (et peut-être d'autres ressources) utilisées par une requête spécifique.
  • Arrêter automatiquement les requêtes dont le temps d'exécution dépasse un certain seuil.

Des idées?

12
Adam Matan

Pour limiter la consommation de mémoire, le paramètre de configuration principale est work_mem. Étant donné que cela s'applique par opération, non par requête, vous ne pouvez pas simplement la définir sur n si vous souhaitez dépenser n quantité de mémoire, mais vous devez le modifier et l'accorder un peu pour obtenir le résultat souhaité.

Cela ne vous aide pas, cependant, en cas de bugs et d'autres fuites de mémoire dans le code de serveur ou des extensions. Vous pouvez contrôler cela avec les limites de ressources spécifiques au processus contrôlées par ulimit. Mais si vous atteignez la limite et l'allocation de mémoire échoue, que voulez-vous avoir? Cela ne se comportera probablement pas trop bien. Mieux réparer ces bugs ou utiliser une version différente.

Les requêtes d'arrêt dont le temps d'exécution a passé un seuil, utilisez le paramètre `énoncé_timeout ', par exemple,

SET statement_timeout TO '10min';
9
Peter Eisentraut

Regardez le Wiki Postgres :

PostgreSQL n'a pas de facilités pour limiter les ressources à un utilisateur, à une requête ou à une base de données particulière qui consomme ou de définir des priorités telles que l'un utilisateur/la requête/la base de données ait plus de ressources que d'autres. Il est nécessaire d'utiliser des installations de système d'exploitation pour obtenir quelle hiérarchisation limitée est possible.

Vous pouvez ajuster Performances Paramètres sur A par utilisateur ou par base de données, mais pas quand abandonner certaines requêtes.

2
DrColossos