Le module pg_buffercache fournit un moyen pour examiner ce qui se passe dans le cache partagé en temps réel.
Ce module propose une fonction C, pg_buffercache_pages, qui renvoie un ensemble d'enregistrements, ainsi qu'une vue, pg_buffercache, qui englobe la fonction pour une utilisation facilitée.
Par défaut, l'accès publique est refusé pour ces deux objets au cas où une faille de sécurité serait présente.
Voici la définition des colonnes exposées par la vue affichée dans Tableau F.16, « Colonnes de pg_buffercache » :
Tableau F.16. Colonnes de pg_buffercache
Nom | Type | Références | Description |
---|---|---|---|
bufferid | integer | ID, qui va de 1 à shared_buffers | |
relfilenode | oid | pg_class.relfilenode | Numéro filenode de la relation |
reltablespace | oid | pg_tablespace.oid | OID du tablespace de la relation |
reldatabase | oid | pg_database.oid | OID de la base de données de la relation |
relforknumber | smallint | Numéro du fork dans la relation ; voir include/common/relpath.h | |
relblocknumber | bigint | Numéro de page dans la relation | |
isdirty | boolean | Page modifiée ? | |
usagecount | smallint | Compteur d'accès clock-sweep | |
pinning_backends | integer | Nombre de processus serveur en accès sur ce bloc |
Il y a une ligne pour chaque tampon dans le cache partagé. Les tampons inutilisés sont affichés avec des champs NULL sauf pour bufferid. Les catalogues systèmes partagés sont affichés comme appartenant à la base de données zéro.
Comme le cache est partagé par toutes les bases de données, il y aura des pages de relations n'appartenant pas à la base de données courante. Cela signifie qu'il pourrait y avoir des lignes sans correspondance dans pg_class, ou qu'il pourrait y avoir des jointures incorrectes. Si vous essayez une jointure avec pg_class, une bonne idée est de restreindre la jointure aux lignes ayant un reldatabase égal à l'OID de la base de données actuelle ou à zéro.
Quand la vue pg_buffercache est utilisée, les verrous du gestionnaire de tampons sont posés suffisamment longtemps pour copier toutes les données d'état du tampon que la vue affichera. Ceci assure à la vue un ensemble cohérent des résultats tout en évitant un blocage trop important de l'activité des tampons. Néanmoins, cela pourrait avoir un impact sur la performance de la base de données si cette vue est lue fréquemment.
regression=# SELECT c.relname, count(*) AS buffers FROM pg_buffercache b INNER JOIN pg_class c ON b.relfilenode = pg_relation_filenode(c.oid) AND b.reldatabase IN (0, (SELECT oid FROM pg_database WHERE datname = current_database())) GROUP BY c.relname ORDER BY 2 DESC LIMIT 10; relname | buffers ---------------------------------+--------- tenk2 | 345 tenk1 | 141 pg_proc | 46 pg_class | 45 pg_attribute | 43 pg_class_relname_nsp_index | 30 pg_proc_proname_args_nsp_index | 28 pg_attribute_relid_attnam_index | 26 pg_depend | 22 pg_depend_reference_index | 20 (10 rows)
Mark Kirkwood <markir@paradise.net.nz>
Suggestions de conception : Neil Conway <neilc@samurai.com>
Conseils pour le débogage : Tom Lane <tgl@sss.pgh.pa.us>