Visualizza e cancella le cache / buffer di Postgres?

A volte eseguo una query Postgres che impiega 30 secondi. Quindi, eseguo immediatamente la stessa query e impiega 2 secondi. Sembra che Postgres abbia una sorta di caching. Posso vedere in qualche modo che cosa contiene questa cache? Posso forzare l’eliminazione di tutte le cache per scopi di ottimizzazione?

Nota: fondamentalmente sto cercando una versione postgres del seguente comando SQL Server:

DBCC FREEPROCCACHE DBCC DROPCLEANBUFFERS 

Ma mi piacerebbe anche sapere come vedere cosa è effettivamente contenuto in quel buffer.

Grazie per qualsiasi aiuto.

Puoi vedere cosa c’è nella cache del buffer di PostgreSQL usando il modulo pg_buffercache. Ho fatto una presentazione chiamata ” Inside the PostgreSQL Buffer Cache ” che spiega cosa stai vedendo, e mostro alcune query più complicate per aiutare a interpretare quell’informazione che va di pari passo con quella.

È anche ansible vedere la cache del sistema operativo anche su alcuni sistemi, vedere pg_osmem.py per un esempio un po ‘approssimativo.

Non c’è modo di cancellare facilmente le cache. Su Linux è ansible arrestare il server del database e utilizzare la funzione drop_caches per cancellare la cache del sistema operativo; assicurati di prestare attenzione all’avviso per eseguire prima la sincronizzazione.

Non ho visto alcun comando per svuotare le cache in PostgreSQL. Quello che vedi è probabilmente un normale indice e una cache di dati letti dal disco e conservati in memoria. sia da postgresql che dalle cache nel sistema operativo. Per sbarazzarsi di tutto questo, l’unico modo che conosco:

Quello che dovresti fare è:

  1. Arresta il server del database (pg_ctl, servizio sudo postgresql stop, ecc.)
  2. echo 3> / proc / sys / vm / drop_caches Questo cancellerà le cache del file / del blocco del sistema operativo – molto importante anche se non so come farlo su altri sistemi operativi.
  3. Avvia il server del database

Io uso questo comando sulla mia macchina Linux:

 sync; /etc/init.d/postgresql-9.0 stop; echo 1 > /proc/sys/vm/drop_caches; /etc/init.d/postgresql-9.0 start 

Si sbarazza completamente del cache.

La risposta di Greg Smith riguardo drop_caches è stata molto utile. Ho trovato necessario interrompere e avviare il servizio postgresql, oltre a far cadere le cache. Ecco uno script di shell che fa il trucco. (Il mio ambiente è Ubuntu 14.04 e PostgreSQL 9.3.)

 #!/usr/bin/sudo bash service postgresql stop sync echo 3 > /proc/sys/vm/drop_caches service postgresql start 

Ho provato con una query che impiegava 19 secondi la prima volta e meno di 2 secondi nei tentativi successivi. Dopo aver eseguito questo script, la query ha richiesto ancora 19 secondi.

Ho avuto questo errore.

psql: /cygdrive/e/test_insertion.sql: 9: ERRORE: il tipo di parametro 53 (t_stat_gardien) non corrisponde a quello della preparazione del piano (t_stat_avant)

Stavo cercando di svuotare il piano attuale e ho trovato questo:

SCARTA IL PIANO

Ho avuto questo tra i miei inserti e risolve il mio problema.

Sì, postgresql ha sicuramente il caching. La dimensione è controllata dall’impostazione shared_buffers . Oltre a ciò, c’è come menziona la risposta precedente, la cache del file OS che viene anche utilizzata.

Se vuoi vedere cosa c’è nella cache, c’è un modulo contrib chiamato pg_buffercache disponibile (in contrib / nell’albero dei sorgenti, nell’RPM contrib o ovunque sia appropriato per come lo hai installato). Come usarlo è elencato nella documentazione standard di PostgreSQL.

Non ci sono modi per svuotare la cache del buffer, se non per riavviare il server. È ansible rilasciare la cache del sistema operativo con il comando indicato nell’altra risposta, a condizione che il proprio sistema operativo sia Linux.

questa è la mia scorciatoia

 echo 1 > /proc/sys/vm/drop_caches; echo 2 > /proc/sys/vm/drop_caches; echo 3 > /proc/sys/vm/drop_caches; rcpostgresql stop; rcpostgresql start; 

C’è il modulo pg_buffercache per esaminare la cache shared_buffers . E a un certo punto ho dovuto abbandonare la cache per fare alcuni test delle prestazioni sulla cache “fredda”, così ho scritto un’estensione pg_dropcache che fa esattamente questo. Per favore controlla.

Sì, è ansible cancellare sia la cache postgres dei buffer condivisi che la cache del sistema operativo. La soluzione qui sotto è per Windows … altri hanno già fornito la soluzione di Linux.

Come molte persone hanno già detto, per cancellare i buffer condivisi è sufficiente riavviare Postgres (non è necessario riavviare il server). Ma solo facendo questo non cancellerà la cache del sistema operativo.

Per cancellare la cache del sistema operativo utilizzata da Postgres, dopo aver arrestato il servizio, utilizzare l’eccellente RamMap ( https://technet.microsoft.com/en-us/sysinternals/rammap ), dall’eccellente Suite Sysinternals. Una volta eseguito RamMap, fai semplicemente clic su “Empty” -> “Empty Standby List” nel menu principale.

Riavvia Postgres e vedrai che la tua prossima query sarà damm slow a causa della mancanza di cache.

Puoi anche eseguire RamMap senza chiudere Postgres, e probabilmente avrai i risultati “senza cache” che desideri, poiché come già detto, i buffer condivisi di solito danno poco impatto rispetto alla cache del sistema operativo. Ma per un test affidabile, preferirei smettere di postgres prima di svuotare la cache del sistema operativo per essere sicuro.

Nota: AFAIK, non è consigliabile cancellare le altre cose oltre a “Elenco di attesa” quando si utilizza RamMap, perché gli altri dati sono in qualche modo utilizzati, e si può potenzialmente causare problemi / dati sfusi se lo si fa. Ricorda che stai cancellando la memoria non solo utilizzata dai file Postgres, ma anche da qualsiasi altra app e OS.

Cordiali saluti, Thiago L.