web-dev-qa-db-fra.com

Voir et effacer les caches / tampons Postgres?

Parfois, j'exécute une requête Postgres, cela prend 30 secondes. Ensuite, j'exécute immédiatement la même requête et cela prend 2 secondes. Il semble que Postgres dispose d'une sorte de cache. Puis-je en quelque sorte voir ce que ce cache contient? Puis-je forcer l'effacement de tous les caches à des fins de réglage?

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.

71
User1

Vous pouvez voir ce qu'il y a dans le cache du tampon PostgreSQL en utilisant le module pg_buffercache. J'ai fait une présentation intitulée " Inside the PostgreSQL Buffer Cache " qui explique ce que vous voyez, et je montre quelques requêtes plus compliquées pour aider à interpréter les informations qui vont avec.

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

Il n'y a aucun moyen de vider facilement les caches. Sous Linux, vous pouvez arrêter le serveur de base de données et utiliser la fonction drop_caches pour effacer le cache du système d'exploitation; assurez-vous de tenir compte de l'avertissement pour exécuter la synchronisation en premier.

51
Greg Smith

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 lus à partir du disque et conservés en mémoire. par les deux postgresql et les caches dans le système d'exploitation. Pour se débarrasser de tout ça, la seule façon que je connaisse:

Ce que vous devez faire, c'est:

  1. Arrêter le serveur de base de données (pg_ctl, arrêt postgresql du service Sudo, etc.)
  2. echo 3>/proc/sys/vm/drop_caches Cela effacera les caches de fichiers/blocs OS - très important même si je ne sais pas comment faire cela sur d'autres OS.
  3. Démarrez le serveur de base de données
19
Leeeroy

J'utilise cette commande sur ma box 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.

14
Mike Starov

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 supprimer 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 de nouveau pris 19 secondes.

11
Steve Saporta

Oui, postgresql a certainement une 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 OS qui est également utilisé.

Si vous voulez regarder ce qui est dans le cache, il y a un module contrib appelé pg_buffercache disponible (dans contrib/dans l'arborescence source, dans le RPM contrib, ou n'importe où est approprié pour la façon dont vous l'avez installé) . Son utilisation est répertoriée dans la documentation PostgreSQL standard.

Il n'y a aucun moyen d'effacer le cache de tampon, autre que de 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.

6
Magnus Hagander

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 à celui lors de la préparation du plan (t_stat_avant)

Je cherchais à vider le plan actuel et j'ai trouvé ceci:

PLANS DE REJET

J'avais ceci entre mes inserts et cela résout mon problème.

6
Luc M

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à donné la solution linux.

Comme beaucoup de gens 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 videra pas le cache du système d'exploitation.

Pour vider le cache du système d'exploitation utilisé par Postgres, après l'arrêt du service, utilisez l'excellent RamMap ( https://technet.Microsoft.com/en-us/sysinternals/rammap ), de l'excellent Sysinternals Suite. Une fois que vous exécutez RamMap, cliquez simplement sur "Empty" -> "Empty Standby List" dans le menu principal.

Redémarrez Postgres et vous verrez maintenant que votre prochaine requête sera extrêmement lente en raison de l'absence de cache du tout.

Vous pouvez également exécuter le RamMap sans fermer Postgres, et vous obtiendrez probablement les résultats "sans cache" souhaités, car comme on l'a déjà dit, les tampons partagés donnent généralement peu d'impact par rapport au cache du système d'exploitation. Mais pour un test fiable, je préfère arrêter les postgres comme tous avant de vider le cache du système d'exploitation pour être sûr.

Remarque: AFAIK, je ne recommande pas d'effacer les autres choses en dehors de la "Liste d'attente" lors de l'utilisation de RamMap, car les autres données sont en quelque sorte utilisées, et vous pouvez potentiellement causer des problèmes/perdre des données si vous le faites. N'oubliez pas que vous effacez la mémoire non seulement utilisée par les fichiers postgres, mais également par toute autre application et système d'exploitation.

Cordialement, Thiago L.

Il y a pg_buffercache module à examiner shared_buffers cache. Et à un moment donné, j'ai dû supprimer 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.

5
Ildar Musin

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;
5
wutzebaer