Voir et effacer les caches / tampons Postgres?

Parfois, je lance une requête Postgres qui prend 30 secondes. Ensuite, j’exécute immédiatement la même requête et cela prend 2 secondes. Il semble que Postgres ait une sorte de mise en cache. Puis-je en quelque sorte voir ce que cette cache contient? Puis-je forcer la suppression de tous les caches à des fins d’optimisation?

Remarque: je recherche essentiellement une version postgres de la commande SQL Server suivante:

DBCC FREEPROCCACHE DBCC DROPCLEANBUFFERS 

Mais je voudrais aussi savoir comment voir ce qui est réellement contenu dans ce tampon.

Merci pour toute aide.

Vous pouvez voir ce qu’il y a dans le cache tampon PostgreSQL en utilisant le module pg_buffercache. J’ai fait une présentation appelée ” Inside the PostgreSQL Buffer Cache ” qui explique ce que vous voyez, et je montre des requêtes plus compliquées pour aider à interpréter ces informations.

Il est également possible de regarder le cache du système d’exploitation sur certains systèmes, voir pg_osmem.py pour un exemple assez approximatif.

Il n’y a aucun moyen de nettoyer les caches facilement. Sous Linux, vous pouvez arrêter le serveur de firebase database et utiliser la fonction drop_caches pour effacer le cache du système d’exploitation. assurez-vous de tenir compte de l’avertissement pour lancer la synchronisation en premier.

Je n’ai vu aucune commande pour vider les caches dans PostgreSQL. Ce que vous voyez est probablement juste des caches d’index et de données normaux en cours de lecture à partir du disque et conservés en mémoire. par les deux postgresql et les caches dans le système d’exploitation. Pour me débarrasser de tout cela, la seule façon dont je connaisse:

Ce que vous devez faire, c’est:

  1. Arrêter le serveur de firebase database (pg_ctl, sudo service postgresql stop, etc.)
  2. echo 3> / proc / sys / vm / drop_caches Cela va effacer les caches de fichiers / blocs du système d’exploitation – très important même si je ne sais pas comment le faire sur d’autres systèmes d’exploitation.
  3. Démarrer le serveur de firebase database

J’utilise cette commande sur ma boîte Linux:

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

Il se débarrasse complètement du cache.

La réponse de Greg Smith à propos de drop_caches a été très utile. J’ai trouvé nécessaire d’arrêter et de démarrer le service postgresql, en plus de déposer les caches. Voici un script shell qui fait l’affaire. (Mon environnement est Ubuntu 14.04 et PostgreSQL 9.3.)

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

J’ai testé avec une requête qui a pris 19 secondes la première fois et moins de 2 secondes lors des tentatives suivantes. Après avoir exécuté ce script, la requête a encore pris 19 secondes.

J’ai eu cette erreur.

psql: /cygdrive/e/test_insertion.sql: 9: ERREUR: le type du paramètre 53 (t_stat_gardien) ne correspond pas à cela lors de la préparation du plan (t_stat_avant)

Je cherchais à vider le plan actuel et à trouver ceci:

PLAN DE DISCARD

J’ai eu ceci entre mes insertions et cela résout mon problème.

Oui, postgresql a certainement la mise en cache. La taille est contrôlée par le paramètre shared_buffers . En dehors de cela, il y a, comme le mentionne la réponse précédente, le cache de fichiers du système d’exploitation qui est également utilisé.

Si vous voulez voir ce qu’il y a dans le cache, il y a un module consortingb appelé pg_buffercache disponible (dans consortingb / dans l’arborescence source, dans le RPM de consortingb, ou n’importe où pour savoir comment vous l’avez installé). Comment l’utiliser est répertorié dans la documentation PostgreSQL standard.

Il n’y a aucun moyen d’effacer le cache de la mémoire tampon, sauf pour redémarrer le serveur. Vous pouvez supprimer le cache du système d’exploitation avec la commande mentionnée dans l’autre réponse, à condition que votre système d’exploitation soit Linux.

c’est mon raccourci

 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; 

Il y a pg_buffercache module pg_buffercache pour regarder dans le cache shared_buffers . Et à un moment donné, j’ai dû abandonner le cache pour effectuer des tests de performances sur le cache “froid”, j’ai donc écrit une extension pg_dropcache qui fait exactement cela. Vérifie s’il te plaît.

Oui, il est possible d’effacer à la fois le cache postgres des tampons partagés et le cache du système d’exploitation. La solution ci-dessous est pour Windows … d’autres ont déjà fourni la solution Linux.

Comme beaucoup de personnes l’ont déjà dit, pour effacer les tampons partagés, vous pouvez simplement redémarrer Postgres (pas besoin de redémarrer le serveur). Mais cela ne supprimera pas le cache du système d’exploitation.

Pour effacer le cache du système d’exploitation utilisé par Postgres, après avoir arrêté le service, utilisez l’excellent RamMap ( https://technet.microsoft.com/en-us/sysinternals/rammap ) de l’excellente suite Sysinternals. Une fois que vous exécutez RamMap, cliquez simplement sur “Vide” -> “Vider la liste d’attente” dans le menu principal.

Redémarrez Postgres et vous verrez que votre prochaine requête sera lente en raison de l’absence de cache.

Vous pouvez également exécuter RamMap sans fermer Postgres, et vous obtiendrez probablement les résultats “sans cache” que vous souhaitez, car les tampons partagés ont généralement peu d’impact par rapport au cache du système d’exploitation. Mais pour un test fiable, je préférerais arrêter les postgres comme avant de vider le cache du système d’exploitation pour s’assurer.

Remarque: Après avoir utilisé RamMap, je ne vous recommande pas d’effacer les autres éléments en plus de la «liste de mise en veille», car les autres données sont en quelque sorte utilisées et vous pouvez éventuellement causer des problèmes / perdre des données. N’oubliez pas que vous effacez non seulement la mémoire utilisée par les fichiers postgres, mais également toute autre application et système d’exploitation.

Cordialement, Thiago L.