Postgresql 8.3: Ressourcenverbrauch pro Abfrage begrenzen

12

Ich verwende PostgreSQL 8.3 + PostGIS 1.3 , um Geodaten auf Ubuntu 8.04 Hardy zu speichern .

Diese spezielle Version von PostGIS hat einen Fehler bei der Berechnung buffer()von sehr komplexen Segmenten, der dazu führt, dass die Abfrage immer mehr Speicher beansprucht, bis der gesamte Computer hängen bleibt.

Ich suche nach einem PostgreSQL-Mechanismus, der Folgendes kann:

  • Begrenzen Sie den Speicherverbrauch (und möglicherweise andere Ressourcen), die von einer bestimmten Abfrage verwendet werden.
  • Beenden Sie automatisch Abfragen, deren Ausführungszeit einen bestimmten Schwellenwert überschreitet.

Irgendwelche Ideen?

Adam Matan
quelle
Warum verwenden Sie weiterhin eine Version, die einen Fehler aufweist, der Sie beißt? Verwenden Sie eine Version, die behoben ist und Ihr Problem behoben ist.
Frank Heikens
Stimmt, aber manchmal gibt es Fehler in unserem Code oder nur Abfragen, die zu lange dauern. Ich möchte, dass sie mit einer Protokollfehlermeldung sterben.
Adam Matan

Antworten:

9

Um den Speicherverbrauch zu begrenzen, lautet der Hauptkonfigurationsparameter work_mem. Da dies pro Operation und nicht pro Abfrage gilt, können Sie es nicht einfach auf N setzen, wenn Sie N Speicherplatz verbrauchen möchten. Sie müssen es jedoch etwas optimieren und optimieren, um das gewünschte Ergebnis zu erzielen.

Dies hilft jedoch nicht bei Fehlern und anderen Speicherverlusten im Servercode oder in den Erweiterungen. Sie können dies mit den prozessspezifischen Ressourcenlimits steuern, die von gesteuert werden ulimit. Was soll geschehen, wenn Sie das Limit erreichen und die Speicherzuweisung fehlschlägt? Es wird sich wahrscheinlich nicht so gut verhalten. Beheben Sie diese Fehler besser oder verwenden Sie eine andere Version.

Die Stop-Abfragen, deren Ausführungszeit einen Schwellenwert überschritten hat, verwenden den Parameter `statement_timeout ', zB

SET statement_timeout TO '10min';
Peter Eisentraut
quelle
Groß. Genau das, wonach ich gesucht habe.
Adam Matan
2

Schauen Sie sich das Postgres Wiki an :

PostgreSQL bietet keine Möglichkeit, den Ressourcenverbrauch eines bestimmten Benutzers, einer bestimmten Abfrage oder einer bestimmten Datenbank zu begrenzen oder Prioritäten so festzulegen, dass ein Benutzer / eine Abfrage / eine Datenbank mehr Ressourcen erhält als andere. Es ist erforderlich, Betriebssystemfunktionen zu verwenden, um zu erreichen, welche begrenzte Priorisierung möglich ist.

Sie können die Leistungseinstellungen pro Benutzer oder pro Datenbank anpassen, jedoch nicht, wann bestimmte Abfragen abgebrochen werden sollen.

DrColossos
quelle
+1 Wie wäre es, wenn Sie ein Maximum für die Speicherkapazität festlegen, die der gesamte Cluster verbrauchen kann?
Adam Matan