Postgresql 8.3: limiter la consommation de ressources par requête


12

J'utilise PostgreSQL 8.3 + PostGIS 1.3 pour stocker des données géospatiales sur Ubuntu 8.04 Hardy .

Cette version particulière de PostGIS a un bogue lors du calcul d'un buffer()sur des segments très complexes, ce qui oblige la requête à prendre de plus en plus de mémoire jusqu'à ce que la machine entière soit bloquée.

Je recherche un mécanisme PostgreSQL qui peut:

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

Des idées?


Pourquoi continuez-vous à utiliser une version contenant un bogue qui vous mord? Utilisez une version corrigée et votre problème a disparu.
Frank Heikens

C'est vrai, mais parfois il y a des bogues dans notre code, ou simplement des requêtes qui prennent trop de temps. Je veux qu'ils meurent avec un message d'erreur de journal.
Adam Matan

Réponses:


9

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

Cependant, cela n'aide pas en cas de bogues et autres fuites de mémoire dans le code du serveur ou les 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 que l'allocation de mémoire échoue, que voulez-vous qu'il se passe? Il ne se comportera probablement pas trop bien. Mieux vaut corriger ces bugs ou utiliser une version différente.

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

SET statement_timeout TO '10min';

Génial. Exactement ce que je cherchais.
Adam Matan

2

Jetez un œil au wiki Postgres :

PostgreSQL ne dispose d'aucune fonctionnalité pour limiter les ressources qu'un utilisateur, une requête ou une base de données particulier consomme, ou pour définir les priorités de manière à ce qu'un utilisateur / requête / base de données obtienne plus de ressources que d'autres. Il est nécessaire d'utiliser les installations du système d'exploitation pour atteindre les priorités limitées possibles.

Vous pouvez ajuster les paramètres de performances par utilisateur ou par base de données, mais pas quand abandonner certaines requêtes.


+1 Qu'en est-il de la définition d'un maximum de la quantité de mémoire que l'ensemble du cluster peut consommer?
Adam Matan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.