Postgresql 8.3: limitare il consumo di risorse per query


12

Sto usando PostgreSQL 8.3 + PostGIS 1.3 per memorizzare i dati geospaziali su Ubuntu 8.04 Hardy .

Questa particolare versione di PostGIS presenta un bug nel calcolo di buffer()segmenti molto complessi, il che fa sì che la query occupi sempre più memoria fino a quando l'intera macchina non si blocca.

Sto cercando un meccanismo PostgreSQL che possa:

  • Limitare il consumo di memoria (e forse altre risorse) utilizzato da una query specifica.
  • Arresta automaticamente le query il cui tempo di esecuzione supera una determinata soglia.

Qualche idea?


Perché continui a utilizzare una versione che ha un bug che ti morde? Utilizzare una versione che è stata risolta e il problema è scomparso.
Frank Heikens,

È vero, ma a volte ci sono bug nel nostro codice o solo query che richiedono troppo tempo. Voglio che muoiano con il messaggio di errore del registro.
Adam Matan,

Risposte:


9

Per limitare il consumo di memoria, il parametro di configurazione principale è work_mem. Poiché questo vale per operazione, non per query, non puoi semplicemente impostarlo su N se vuoi spendere N quantità di memoria, ma devi modificarlo e ottimizzarlo un po 'per ottenere il risultato desiderato.

Ciò non aiuta, tuttavia, in caso di bug e altre perdite di memoria nel codice o nelle estensioni del server. È possibile controllarlo con i limiti di risorse specifici del processo controllati da ulimit. Ma se raggiungi il limite e l'allocazione della memoria fallisce, cosa vuoi che accada? Probabilmente non si comporterà troppo bene. Meglio correggere quei bug o usare una versione diversa.

Le query di arresto il cui tempo di esecuzione ha superato una soglia, utilizzano il parametro `statement_timeout ', ad es.

SET statement_timeout TO '10min';

Grande. Proprio quello che stavo cercando.
Adam Matan,

2

Dai un'occhiata al Wiki di Postgres :

PostgreSQL non ha strutture per limitare le risorse che un determinato utente, query o database consuma o, di conseguenza, per impostare priorità in modo tale che un utente / query / database ottenga più risorse di altri. È necessario utilizzare le strutture del sistema operativo per ottenere la priorità limitata possibile.

È possibile regolare le impostazioni delle prestazioni su un utente o per database, ma non quando interrompere determinate query.


+1 Che ne dici di impostare un massimo per la quantità di memoria che l'intero cluster può consumare?
Adam Matan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.